Python 多任务(进程) day1(3)

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

试了一下发现多进程需要在main函数中使用,如果直接在外面创建使用就不行,只能加main函数,然后在main中调用
https://fishc.com.cn/forum.php?mod=viewthread&tid=158430&page=1#pid4419075

如果想要让主进程和进程池进行通信,就要用 multiprocessing.Manager.Queue()  创建队列

posted @ 2020-02-28 18:29  otome  阅读(129)  评论(0编辑  收藏  举报