• Python并发执行(未完待续)


    python的多进程执行

    多进程实现方式一

    1. from multiprocessing import Process
    2. def func1(name):
    3. print("测试 %s 多进程" %name)
    4. if __name__ == "__main__":
    5. process_list = []
    6. for i in range(5):
    7. p = Process(target = func1, args = ('Python', ))
    8. p.start()
    9. process_list.append(p)
    10. for i in process_list:
    11. p.join()
    12. print("结束测试")

    多进程实现方式二 

    1. from multiprocessing import Process
    2. class MyProcess(Process): # 继承Process类
    3. def __init__(self, name):
    4. super(MyProcess, self).__init__()
    5. self.name = name
    6. def run(self):
    7. print("测试%s多进程" % self.name)
    8. if __name__ == '__main__':
    9. process_list = []
    10. for i in range(5):
    11. p = MyProcess('Python {}'.format(i))
    12. p.start()
    13. process_list.append(p)
    14. for i in process_list:
    15. p.join()
    16. print('测试结束')

    python进程通信方式

    管道(命名管道、匿名管道)

    消息队列

    共享内存

    信号量

    信号

    Socket

    管道Pipe

    调用Pipe()返回管道两端的Connection;Pipe的读写效率高于Queue,进程间的Pipe基于fork机制建立。

    Python官方文档的描述:

    Returns a pair (conn1, conn2) of Connection objects representing the ends of a pipe.

    新建Pipe(duplex)的时候

    • 如何duplex为Flase,Pipe适用于只有两个进程一读一写的单双工情况; 
    • 如果duplex为True,Pipe适用于两个进程双工情况;【默认为True】

    Pipe的方法包含 send()、recv()、close();当pipe的输入端被关闭,且无法接受接收到输入端的值,则会抛出EOFError。

    1. from multiprocessing import Process, Pipe
    2. import time
    3. def func1(conn):
    4. print("子进程发送消息:")
    5. conn.send("你好主进程")
    6. print("子进程接收消息:")
    7. print(conn.recv())
    8. conn.close()
    9. if __name__ == '__main__':
    10. conn1, conn2 = Pipe()
    11. p = Process(target = func1, args = (conn2, ))
    12. p.start()
    13. time.sleep(1)
    14. print('主进程接受消息:')
    15. print(conn1.recv())
    16. print('主进程发送消息:')
    17. conn1.send("你好子进程")
    18. p.join()
    19. print('结束测试')
     进程队列

    Queue是基于Pipe实现的

    Queue的使用主要是一边put(),一边get();但是Queue可以是多个Process进行put操作,也可以是多个Process进行get操作。

    1. from multiprocessing import Process, Queue
    2. import time
    3. def func1(queue, index):
    4. print("子进程 {} 开始put数据".format(index))
    5. queue.put("子进程 {}, 通过Queue开始通信".format(index))
    6. if __name__ == "__main__":
    7. queue = Queue()
    8. process_list = []
    9. for i in range(3):
    10. p = Process(target = func1, args = (queue, i, ))
    11. p.start()
    12. process_list.append(p)
    13. print("开始join")
    14. for i in process_list:
    15. p.join()
    16. print('主进程获取Queue数据')
    17. for i in range(3):
    18. print(queue.get())
    19. print("结束测试")
    Managers

    Queue,Pipe仅实现数据交互, 并未实现数据共享。进程间交互使用到managers

    python的多线程执行

    1. from concurrent.futures import ThreadPoolExecutor
    2. import time
    3. # 设置最大的线程个数
    4. executor = ThreadPoolExecutor(max_workers = 8)
    5. all_num = 100
    6. def worker(index):
    7. time.sleep( (int)(index) / 5)
    8. print(index)
    9. def run():
    10. time1 = time.time()
    11. for id_ in range(all_num):
    12. executor.submit(worker,id_)
    13. executor.shutdown(wait = True)
    14. time2 = time.time()
    15. print(time2 - time1)
    16. if __name__ == "__main__":
    17. run()

  • 相关阅读:
    2022/11/2 springboot整合mongodb
    2023常州大学计算机考研信息汇总
    Thinkpad x13 锐龙安装 Archlinux 记录
    ESP8266_Rtos3.0环境搭建
    访问 github 问题解决方法
    基于新标记方案的实体和关系联合提取
    End-to-End Object Detection with Transformers(DETR)论文阅读与理解
    【HTML】重点知识内容~快速上手
    云原生Docker网络管理
    Springboot——关于Springboot线程池时使用ThreadLocal 类的一个小小的漏洞
  • 原文地址:https://blog.csdn.net/jiangchao98/article/details/133316254