Python 多任务(进程) day1(3)
- 进程间的通信
- 可以用socket进行进程间的通信
- 可以用同一文件来进行通信,即在同一个文件中进行读写操作的交流(但是在硬盘上读取和写入比较慢,内存运行太快了)
- Queue队列(记得是队列) 在同一内存中通信
- 因为进程之间不能共享全局变量,所以通过创建队列,把队列当成实参传入函数
- multiprocessing.Queue() 创建队列,括号里面可以填数字代表最多存放几个,不填的话,系统自动把你选择最大的
- 可以用 x.put(XX) 来存入数据,如果是满的,就堵塞
- 可以用 x.get(XX) 来取出数据,如果是空的,就堵塞
- 可以用 x.full() / x.empty() 来检验队列是否为 慢/空,返回 False或 True
- 用来解耦
- 进程池Pool
- 作用:缓存,可以让人们重复利用进程池里的进程,因为进程的创建和销毁需要大量资源
- 概念:就像开饭店一样,每个座椅都是一个进程,总不能来一个人买一套座椅,然后再卖掉,再来一个人再买再卖;
所以只能预先买好座椅,但如果来100个人,难道要买一百套吗?
不!可能只买20套就是最好的(需要根据测试),这样就能即快速,又经济地服务所有人 - multiprocessing.Pool(3) 最大进程数3,但如果在短时见内加入多个进程,即不会失败也不会堵塞,而会把多出来的进程存储起来
- x.close() # 关闭进程池
- x.join() # 进程池的主进程不会等待池里的进程结束才结束,会自己结束,所以要调用 x.join() 来等待池中的子进程结束,必须放在close语句后
试了一下发现多进程需要在main函数中使用,如果直接在外面创建使用就不行,只能加main函数,然后在main中调用
(https://fishc.com.cn/forum.php?mod=viewthread&tid=158430&page=1#pid4419075)
如果想要让主进程和进程池进行通信,就要用 multiprocessing.Manager.Queue() 创建队列