• Python多进程


    进程:是资源的集合,一个进程至少包含一个线程。所有程序的进程由系统的父进程拉起。如linux中所有进程由PID:1的进程创建
     
    进程间数据交互:
    这里需要用到进程包的queue,由于多个进程无法共享数据,所以没有办法使用import queue
     1 from multiprocessing import Process,Queue
     2 
     3 def pan(rr):
     4     rr.put([1,"2sdf"])
     5 
     6 if __name__ == "__main__":
     7     #创建进程queue队列对象
     8     q = Queue()
     9     #创建子进程,target=函数名,args=进程队列对象
    10     p = Process(target=pan,args=(q,))
    11     #启动进程
    12     p.start()
    13     #获取队列中的值
    14     print(q.get())
    15     #等待进程结束
    16     p.join()
    通过Pipe(管道)实现进程间数据交互
    1、管道是一发一收机制
    2、如果收的次数大于发的次数,程序就会卡住
     1 from multiprocessing import Process,Pipe
     2 
     3 def execut(conn):
     4     conn.send([1,"hello word"])
     5     print("接收主进程发来的消息:%s"%conn.recv())
     6 
     7 if __name__ == "__main__":
     8     #创建管道对象,当管道对象创建后必定返回两个参数,把这两个参数分别赋给不同的进程即可
     9     Apipe,Bpipe = Pipe()
    10     p = Process(target=execut,args=(Bpipe,))
    11     p.start()
    12     print("接收子进程发来的消息:%s"%Apipe.recv())
    13     Apipe.send({"王阳明": "传习录"})
    14     p.join()

    通过Manager包创建多进程共享

     1 #进程间共享一份数据
     2 #这里Manager实际是将主进程创建的内存对象拷贝给子进程,在所有进程结束后合并所有进程产生的数据。
     3 
     4 from multiprocessing import Process,Manager
     5 import os
     6 
     7 def run(dt,lt):
     8     dt["name"] = "sober"
     9     dt["workdata"] = "2018-05-09"
    10     lt.append(os.getpid())
    11     print(lt)
    12 
    13 if __name__ == "__main__":
    14     with Manager() as mng:
    15         #使用Manager对象创建一个共享字典
    16         dt = mng.dict()
    17         #使用Manager对象创建一个共享列表
    18         lt = mng.list()
    19         #存储子进程对象
    20         plist = []
    21         for i in range(5):
    22             #创建子进程
    23             p = Process(target=run,args=(dt,lt))
    24             p.start()
    25             plist.append(p)
    26         for n in plist:
    27             #等待所有子进程结束
    28             n.join()
    29 
    30         print(dt)
    31         print(lt)

    进程池使用

     1 from multiprocessing import Process,Pool
     2 import os
     3 
     4 def run(n):
     5     #创建子进程执行函数
     6     print("Start number: %s"%n)
     7 
     8 def backDef(b):
     9     #显示回调函数的信息,打印执行回调函数的PID
    10     print("CallBacke Def :%s"%b,os.getpid())
    11 
    12 if __name__ == "__main__":
    13     print("Print master processes PID:%s"%os.getpid())
    14     #定义一个进程池,限制进程数为:2
    15     pl = Pool(processes=2)
    16     #创建进程
    17     for i in range(10):
    18         #异步进程,func=进程执行方法名,args=方法参数,callback=回调函数
    19         pl.apply_async(func=run,args=(i,),callback=backDef)
    20     print("Test finish")
    21     #先关闭池子,在等待池子内的工作都完成
    22     pl.close()
    23     pl.join()
  • 相关阅读:
    [Redis]主从同步可能遇到的坑
    Redis_如何保证原子操作
    .Net Core 5.0 Json序列化和反序列化 | System.Text.Json 的json序列化和反序列化
    JavaScript Error对象整理_JavaScript 异常处理整理
    Canvas 事件绑定|Canvas事件处理
    Css3 常用布局方式 一行两列&高度自适应&垂直方向居中
    Css3 实现锯齿效果整理
    Css3 currentColor 变量使用
    Css3 实现任意角扇形|Css3实现六角扇形
    实现 Application_Start 和 Application_End
  • 原文地址:https://www.cnblogs.com/shangmo/p/9016417.html
Copyright © 2020-2023  润新知