当前位置: 首页 > news >正文

【多进线程】python多进线程与通信

多进线程

选择多进程还是多线程取决于任务类型:

  • CPU密集型任务: 多进程,可充分利用多核

  • I/O密集型任务:多线程,创建和切换开销小

  • 进程间不共享内存,需要通过队列、管道等机制进行通信

1. python多进程实现方法

1.1 multiprocessing

import multiprocessingdef worker1(task_name, duration):'''进程1'''print("进程1")def worker2(task_name):'''进程2'''print("进程2")def main():# 创建进程child_process1 = multiprocessing.Process(target=worker1, args=("arg1", "arg2"))child_process2 = multiprocessing.Process(target=worker2, args=("arg1"))# 启动进程child_process1.start()child_process2.start()# 等待进程结束child_process1.join()child_process2.join()print("所有任务完成")

1.2 concurrent.futures

1.2.1 ProcessPool 进程池
from concurrent.futures import ProcessPoolExecutorPROCESS_POLL_MAX = 10def worker1(task_name, duration):'''进程1'''print("进程1")def worker2(task_name):'''进程2'''print("进程2")def main():executor = ProcessPool(max_workers=THREAD_POLL_MAX)process_list = []while True:if 1:future = executor.submit(worker1, arg1, arg2)process_list.append(future)if 2:future = executor.submit(worker2, arg1)process_list.append(future)# 未被占用的线程process_list = [ p for p in process_list if not p.done ]# 资源回收executor.shutdown(wait=True)

1.3 os.fork 父子2个进程

import osdef main():# 创建子进程pid = os.fork()if pid > 0:# 父进程print(f"父进程:我的pid {os.getpid()}")print(f"父进程:创建的子进程ppid: {pid}")elif pid == 0:# 子进程print(f"子进程:我的pid:{os.getpid()}")print(f"子进程:父进程的pid:{os.ggetppid()}")else:print("创建进程失败")

2. python多线程实现方法

2.1 threading

import threadingdef worker(task_name, duration):"""线程执行的任务函数"""print(f"任务 {task_name} 开始执行")time.sleep(duration)print(f"任务 {task_name} 完成,耗时 {duration} 秒")# 创建线程
thread1 = threading.Thread(target=worker, args=("A", 2))
thread2 = threading.Thread(target=worker, args=("B", 3))# 启动线程
thread1.start()
thread2.start()# 等待线程完成
thread1.join()
thread2.join()print("所有任务完成")

2.2 concurrent.futures 线程池

2.2.1 ThreadPoolExecutor
from concurrent.futures import ThreadPoolExecutor
THREAD_POLL_MAX = 10 #现成池线程数def task1(arg):print("args:", args)def task2(arg1, arg2, arg3):print("args:", args)def main():executor = ThreadPoolExecutor(max_workers=THREAD_POLL_MAX)thread_list = []while True:if 1:future = executor.submit(task1, arg1)thread_list.append(future)if 2:future = executor.submit(task2, arg1, arg2, arg3) # 每个线程的参数个数等可以不同thread_list.append(future)# 未被占用的线程thread_list = [ t for t in thread_list if not t.done ]# 资源回收executor.shutdown(wait=True)

3. 进线程间通信

3.1 Queue 队列

import threading
import queuedef producer(q, producer_id):'''生产者线程,往队列添加产物'''# 如要求每个id 生产者,生产5个产物for i in range(5):item = f"{producer_id}产出的{i}产物"q.put(item)print(f"生产者{producer_id}生产了:{item}")def consumer(q, consumer_id):'''消费者线程,从队列拿出产物'''while True:item = q.get()if item is None:q.put(None) # 将结束信号放回,让其他消费者也能结束breakelse:print(f"消费者{consumer_id}消费了{item}")q.task_done()def main():# 创建队列q = queue.Queue()#创建生产者与消费者线程producers = []consumers = []# 2个生产者线程for i in range(2):t = threading.Thread(target=producer, args=(q, i))t.start()producers.append(t)# 2个消费者线程for i in range(2):t = threading.Thread(target=consumer, args=(q, i))t.start()consumers.append(t)    # 等待生产者完成
for t in producers:t.join()# 等待队列中所有的任务被处理
q.join()# 添加结束信号
q.put(None)# 等待消费者完成
for t in consumers:t.join()print("所有任务完成")

3.2 multiprocessing 管道

import multiprocessingdef worker(conn, worker_id):'''工作进程'''while True:data = conn.recv()if data = 'exit':break;print(f"工作进程{eorker_id} 接收到{data}")# 处理rusult = data.upper()# 并发回处理结果conn.send(rusult)conn.close()def main():# 创建管道parent_conn, chile_conn = multiprocessing.Pipe()# 创建子进程p = multiprocessing.Process(target=worker, args=(child_conn, 1))p.start()# 主进程发送数据messages = ['hell', 'world', 'python', 'exit']for msg in message:parent_conn.send(msg)if msg != 'exit'response = parent_conn.recv()print(f"主进程收到{msg}发送结果响应{response}")# 进程等待回收p.join()print("所有任务均已完成")

4. 信号同步

import signal
import threadingsignal_user1_flag = threading.Event()# 信号接口处理函数
def signal_user1_handle_worker():signal_user1_flag.set()def worker():if not signal_user1_flag.is_set():print("work....")# 信号注册(可注册多个)
signal.signal(signal.SIGUSER1, signal_handle_worker)# 信号发送
os.kill(pid, signal.SIGUSER1)
http://www.dtcms.com/a/490705.html

相关文章:

  • 低代码新建表单实操:纯表单 / 列表表单配置 + 表名避坑
  • 前端做数据表格的网站网站建设与运营市场风险
  • 从入门到精通:深度探索RT-Thread物联网操作系统
  • GPUStack:开源GPU集群管理工具,解锁AI模型高效运行新可能
  • LeetCode算法日记 - Day 74: 按摩师、打家劫舍II
  • centos离线包获取-附centos7主流离线包资源
  • 电子商务网站建设哪好网站内链建设
  • 网站建设的主题软媒win7优化大师
  • 人力网站建设的建议软文平台发布
  • 【35】MFC入门到精通——MFC运行 不显示对话框 MFC界面不显示
  • 开源 C++ QT QML 开发(二十一)多媒体--视频播放
  • PMBT2222A,215 开关晶体管功率二极管 NXP安世半导体 音频放大电路 LED驱动 应用
  • 大语言模型(LLM)入门笔记:嵌入向量与位置信息
  • 网站设计济南做网站的一定要开80或8080端口
  • 【Spring Boot从入门到精通】原理、实战与最佳实践
  • uni-app 入门学习教程,从入门到精通,uni-app 基础知识详解 (2)
  • Pyspark分布式访问NebulaGraph图数据库
  • FPGA----petalinux的Ubuntu文件系统移植
  • 宜昌网站建设厂家wordpress 扁担
  • TensorFlow2 Python深度学习 - 卷积神经网络示例2-使用Fashion MNIST识别时装示例
  • Eureka: Human-Level Reward Design via Coding Large Language Models 译读笔记
  • 随时随地看监控:我的UptimeKuma远程访问改造记
  • 关于网站篡改应急演练剧本编写(模拟真实场景)
  • 河北省企业网站建设公司企业管理系统软件有哪些
  • JVM的classpath
  • RVO优化
  • ethercat 环型拓扑(Ring Topology)
  • 颠覆PD快充、工业控制与智能家电等领域高CTR,高隔离电压高可靠性光电耦合器OCT1018/OCT1019
  • 【机器学习入门】8.1 降维的概念和意义:一文读懂降维的概念与意义 —— 从 “维度灾难” 到低维嵌入
  • 黄骅市旅游景点有哪些盐城网站关键词优化