python高级-线程和进程相关

news/2024/11/30 7:58:01/

这里前面的linux基础就不补充了,只写一些比较高级的

目录

一、文件查找

1.按照名字查找

2.通配符

3.文件大小查找

二、压缩和打包

1.zip

2.gzip

3.tar命令

三、权限管理

四、多进程

1.创建进程

2.获取进程id

3.进程传参

4.进程不共享全局变量

5.守护进程

5.1.方式1

5.2.方式2

五、线程

1.线程创建

2.线程执行带有参数的任务

3.线程的无序性

4.守护主线程

5.阻塞线程

6.线程间共享全局变量

7.多线程中共享变量的资源竞争问题

8.使用线程同步解决

9.互斥锁

10.死锁

11.死锁哲学家问题

结语


一、文件查找

1.按照名字查找

find 查找目录 -name 文件名字

2.通配符

*匹配多个字符

?匹配单个字符

3.文件大小查找

find 文件目录 -size [+,-]长度

查找当前目录以及子目录下大于4K的文件

find . -size +4k

查找当前目录以及子目录下小于4K的文件

find . -size -4k

二、压缩和打包

1.zip

zip

unzip

2.gzip

gzip使用

解压

gzip -d

3.tar命令

常用

打包

tar cvf

压缩

所以说压缩一个文件分两步,先打包,后压缩

tar命令也可以一步到位

tar zcvf

相应的解包也可以一步到位

tar xcvf

或者tart xvf先解压,-C执行解压到的目录


三、权限管理

rwx-rwx-rwx


四、多进程

1.创建进程

import multiprocessing
import timedef task1():for i in range(10):print('A -- ',i + 1)time.sleep(1)def task2():for i in range(10):print('B -- ',i + 1)time.sleep(1)if __name__ == '__main__':p1 = multiprocessing.Process(target=task1)p2 = multiprocessing.Process(target=task2)p1.start()p2.start()

2.获取进程id

获取进程ID和进程的父ID,进程名

这两个进程都是同一个父进程拉起来的


import multiprocessing
import time
import osdef task1():mp = multiprocessing.current_process()print("task1:  ", mp)print(f"任务1的PID:{os.getpid()} 父进程的PID是{os.getppid()}")time.sleep(1)def task2():mp = multiprocessing.current_process()print("task2:  ", mp)print(f"任务2的PID:{os.getpid()} 父进程的PID是{os.getppid()}")time.sleep(1)if __name__ == '__main__':print(f"主进程的PID:{os.getpid()} 父进程的PID是{os.getppid()}")#获取当前进程对象mp = multiprocessing.current_process()print("main:  ",mp)p1 = multiprocessing.Process(target=task1,name='p1')p2 = multiprocessing.Process(target=task2,name='p2')print(p1)print(p2)p1.start()p2.start()print(p1)print(p2)

3.进程传参

必须要传入可迭代参数

import multiprocessing
import timedef task(count):for i in range(count):print("任务执行中。。。")time.sleep(0.2)else:print("任务执行完成")if __name__ == '__main__':#因为参数sub_process = multiprocessing.Process(target=task,args=5)sub_process.start()

import multiprocessing
import timedef task(count):for i in range(count):print("任务执行中。。。")time.sleep(0.2)else:print("任务执行完成")if __name__ == '__main__':sub_process = multiprocessing.Process(target=task,kwargs={"count": 4})sub_process.start()

字典必须要要与参数名相同

import multiprocessing
import timedef task(count):for i in range(count):print("任务执行中。。。")time.sleep(0.2)else:print("任务执行完成")if __name__ == '__main__':#因为参数sub_process = multiprocessing.Process(target=task,kwargs={'a':2})sub_process.start()

4.进程不共享全局变量

import multiprocessing
import timeg_list = list()def add_data():for i in range(6):g_list.append(i)print("add: ",i)time.sleep(0.2)print("add_data: ",g_list)def read_data():print("read_data",g_list)if __name__ == '__main__':# 创建添加数据的子进程add_data_process = multiprocessing.Process(target=add_data)# 创建读取数据的子进程read_data_process = multiprocessing.Process(target=read_data)#启动子进程执行对应的任务add_data_process.start()#阻塞函数,add_data_process执行完才会继续向下执行add_data_process.join()#全局变量不共享read_data_process.start()

5.守护进程

5.1.方式1

import multiprocessing
import timeg_list = list()def add_data():for i in range(6):g_list.append(i)print("add: ",i)time.sleep(0.2)print("add_data: ",g_list)def read_data():print("read_data",g_list)if __name__ == '__main__':# 创建添加数据的子进程add_data_process = multiprocessing.Process(target=add_data)# 创建读取数据的子进程read_data_process = multiprocessing.Process(target=read_data)#启动子进程执行对应的任务add_data_process.start()#阻塞函数,add_data_process执行完才会继续向下执行add_data_process.join()#主进程结束之前,手动调用方法结束子进程    add_data_process.terminate()print("add_data terminate")#全局变量不共享read_data_process.start()

5.2.方式2


import multiprocessing
import timeg_list = list()def add_data():for i in range(6):g_list.append(i)print("add: ",i)time.sleep(0.2)print("add_data: ",g_list)def read_data():print("read_data",g_list)if __name__ == '__main__':# 创建添加数据的子进程add_data_process = multiprocessing.Process(target=add_data)# 创建读取数据的子进程read_data_process = multiprocessing.Process(target=read_data)#锁add_data_process.daemon = True#启动子进程执行对应的任务add_data_process.start()#阻塞函数,add_data_process执行完才会继续向下执行add_data_process.join()#全局变量不共享read_data_process.start()


五、线程

1.线程创建


import threading
import timedef task1():t = threading.currentThread()print("task1: ",t)for i in range(5):print(" Task A ", i+1)time.sleep(0.5)def task2():t = threading.currentThread()print("task2: ",t)for i in range(5):print(" Task B ", i+1)time.sleep(0.5)#创建线程
if __name__ == '__main__':t1 = threading.Thread(target=task1,name='t1')t2 = threading.Thread(target=task2,name='t2')print(t1)print(t2)#创建好线程后,线程并不会被执行#必须启动线程t1.start()t2.start()print(t1)print(t2)print("Main Thread")

2.线程执行带有参数的任务

import threading
import timedef task(count):for i in range(count):print("任务执行中。。。")time.sleep(0.2)else:print("任务执行完成")def task1(content , count):for i in range(count):print(content,'--',i+1)time.sleep(0.5)if __name__ == '__main__':sub_thread = threading.Thread(target=task,args=(5,))sub_thread2 = threading.Thread(target=task1,args=('Python',5))sub_thread.start()sub_thread2.start()

3.线程的无序性

import threading
import time
def task():t = threading.current_thread()for i in range(10):print(t.name)time.sleep(0.5)if __name__ == '__main__':for i in range(5):t = threading.Thread(target=task)t.start()

4.守护主线程

没有守护线程,主线程会随即执行

import threading
import timedef task():t = threading.current_thread()for i in range(5):print(t.name)time.sleep(0.5)if __name__ == '__main__':t1 = threading.Thread(target=task,name='t1')t2 = threading.Thread(target=task,name='t2')t1.start()t2.start()print("main over")

 

方法1

这个方法主线程不等待子线程所以会出现问题


import threading
import timedef task():t = threading.current_thread()for i in range(5):print(t.name)time.sleep(0.5)if __name__ == '__main__':t1 = threading.Thread(target=task,name='t1',daemon=True)t2 = threading.Thread(target=task,name='t2',daemon=True)t1.start()t2.start()print("main over")

方法2

import threading
import timedef task():t = threading.current_thread()for i in range(5):print(t.name)time.sleep(0.5)if __name__ == '__main__':t1 = threading.Thread(target=task,name='t1')t2 = threading.Thread(target=task,name='t2')t1.setDaemon(True)t2.setDaemon(True)t1.start()t2.start()print("main over")

5.阻塞线程

import threading
import timedef task():t = threading.current_thread()for i in range(5):print(t.name)time.sleep(0.5)if __name__ == '__main__':t1 = threading.Thread(target=task,name='t1')t2 = threading.Thread(target=task,name='t2')t1.setDaemon(True)t2.setDaemon(True)t1.start()t2.start()t1.join()t2.join()print("main over")

6.线程间共享全局变量

import threading
import timec_list = []def add_data():for i in range(5):c_list.append(i)print(c_list)time.sleep(0.5)def read_data():print("read: ",c_list)if __name__ == '__main__':add_t = threading.Thread(target=add_data)read_t = threading.Thread(target=read_data)add_t.start()read_t.start()

7.多线程中共享变量的资源竞争问题

import threading
import timeg_num = 0def sum_num1():for i in range(1000000000):global g_numg_num += 1print("sum1:  ",g_num)if __name__ == '__main__':f_t = threading.Thread(target=sum_num1)f_t2 = threading.Thread(target=sum_num1)f_t.start()f_t2.start()time.sleep(3)print("main",g_num)

转存失败重新上传取消

时间片轮转的问题

8.使用线程同步解决

线程等待(阻塞)

import threading
import timeg_num = 0def sum_num1():for i in range(1000000000):global g_numg_num += 1print("sum1:  ",g_num)if __name__ == '__main__':f_t = threading.Thread(target=sum_num1)f_t2 = threading.Thread(target=sum_num1)f_t.start()#阻塞f_t.join()f_t2.start()f_t2.join()time.sleep(3)print("main",g_num)

 转存失败重新上传取消

9.互斥锁

上锁

原子操作

解锁

import threading
import time#创建一个实例锁
metax_lock = threading.Lock()g_num = 0def sum_num1():t = threading.current_thread()for i in range(1000000000):metax_lock.acquire()global g_numg_num += 1print(t.name,"=------=",g_num)metax_lock.release()print("sum1:  ",g_num)if __name__ == '__main__':f_t = threading.Thread(target=sum_num1)f_t2 = threading.Thread(target=sum_num1)f_t.start()f_t2.start()time.sleep(3)print("main",g_num)

注意不要变成同步锁,一般都是异步执行

10.死锁

这个函数就有个死锁

import multiprocessing
import threading
import timec_list = [1,2,3,4325]lock = threading.Lock()
def get_value(index):#锁lock.acquire()t = threading.current_thread()if index >= len(c_list):print(f'{index} 下界太大,导致下标越界')return print(t.name,"取得第",index,'个值,值为',c_list[index])lock.release()if __name__ == '__main__':for i in range(5):t = threading.Thread(target=get_value,args=(i,))t.start()

我们解决掉他

import multiprocessing
import threading
import timec_list = [1,2,3,4325]lock = threading.Lock()
def get_value(index):#锁lock.acquire()t = threading.current_thread()if index >= len(c_list):print(f'{index} 下界太大,导致下标越界')lock.release()returnprint(t.name,"取得第",index,'个值,值为',c_list[index])lock.release()if __name__ == '__main__':for i in range(5):t = threading.Thread(target=get_value,args=(i,))t.start()

但这里其实还有问题,我们后面讨论

11.死锁哲学家问题

import multiprocessing
import threading
import timelock_a = threading.Lock()
lock_b = threading.Lock()def PersonA():for i in range(100):lock_a.acquire()print("A抢到第一个筷子,加一个锁")lock_b.acquire()print("A加第二个锁,强盗第二根筷子,吃一口饭")lock_b.release()print("A释放锁,放下第二根筷子")lock_a.release()print("A加第一个锁,抢到第一根筷子")def PersonB():for i in range(100):lock_a.acquire()print("B抢到第一个筷子,加一个锁")lock_b.acquire()print("B加第二个锁,强盗第二根筷子,吃一口饭")lock_b.release()print("B释放锁,放下第二根筷子")lock_a.release()print("B加第一个锁,抢到第一根筷子")if __name__ == '__main__':pa = threading.Thread(target=PersonA)pb = threading.Thread(target=PersonB)pa.start()pb.start()


结语

python的部分快要结束了,后面要更新linux服务器和k8s的笔记,希望大家多多👍


http://www.ppmy.cn/news/363310.html

相关文章

苹果各屏幕尺寸整理

手机型号屏幕尺寸屏幕密度开发尺寸像素尺寸倍图4/4s3.5 inch326 ppi320*480 pt640*960 px2x5/5S/5c/SE4.0 inch326 ppi320*568 pt640*1136 px2x6/6S/7/84.7 inch326 ppi375*667 pt750*1334 px2x6/6S/7/85.5 inch401 ppi414*736 pt1242*2208 px3xX5.8 inch458 ppi375*812 pt1125…

安卓桌面壁纸_苹果iPhone全面屏桌面壁纸 第88期 苹果x手机专用高清壁纸

苹果iPhone全面屏桌面壁纸 第88期 苹果x手机专用高清壁纸 找不到适合自己手机尺寸的壁纸?没关系,加小编微信:iphone5768 告诉小编,帮你解决。另外,小编现在会在壁纸文章内加入使用IPHONE的小技巧,大家要留意哦。

iPhone 各屏幕尺寸整理

手机型号屏幕尺寸屏幕密度开发尺寸像素尺寸倍图5/5S/5c/SE4.0 英寸326 ppi320*568 pt640*1136 px2x6/6S/7/84.7 英寸326 ppi375*667 pt750*1334 px2x6/6S/7/85.5 英寸401 ppi621*1104 pt1242*2208 px3xX/XS/11 Pro5.8 英寸458 ppi562*1218 pt1125*2436 px3xXR/116.1 英寸326 pp…

家里WiFi突然连不上网了?

今天家里的WiFi突然不能上网了,手机显示已连接(不可上网),经过多次断点测试,终于找到了原因,成功解决WiFi不能上网问题。 1、首先,查看光纤入户装置光猫,若光猫指示灯亮着&#xff…

解决 手机能连接上wifi而电脑却却不能连接上wifi的情况

今天电脑正在看视频突然就掉线了,wifi虽然连着这,却用不了了,但手机还可能用wifi正常上网,在网上进行种种搜索,终于给解决了 1同时按着键盘上的winr键,在打开的窗口中输入 service.msc 2找到Wired AutoCon…

win10电脑不显示手机连接服务器失败,技术员教你解决win10系统手机连接不上电脑没反应的操作办法...

也许大家在用电脑工作的使用中会遇到win10系统手机连接不上电脑没反应的情况,有时突然遇到win10系统手机连接不上电脑没反应的问题就不知道该怎么办了,最近有不少用户到本站咨询win10系统手机连接不上电脑没反应的问题该怎么处理。你只要按照  1、电脑…

手机网络链接不上了怎么办

智能手机连接不上网的原因可能是手机数据没有打开。 解决方法: 1、打开手机“设置”,选择第一个“无线和网络”; 2、选择“移动网络”; 3、选择“接入点名称”;进来以后就能看到各个接入点情况了,如果此时没有接入点项目,或是被改…