生产者和消费者模型
-
进程间通信(IPC inter-process communication)
-
如何实现进程间通信
- 将消息放入队列中,由另一个进程从另一个队列中取出
- 这种通信方式是非阻塞的,发送进程不需要等待接收进程的相应就可执行
- multiprocessing有两种形式通信:队列、管道
-
管道
- stdin
- stdout
- stderr
-
队列
- 管道+锁就是队列
- 队列的特性是FIFO
-
进程间通信的目的
- 进程间传输数据
-
python中如何实现队列
- queue模块:创建共享队列
- import queue#导入模块
- queue = queue.Queue()#创建对象
- queue.put()#放数据,数据超出容量,阻塞
- q.get() #取数据,没有数据就一直阻塞
- q.get_nowait()#取数据?没有数据就报错
- q.put_nowait()#放数据?数据超出容量,阻塞
- q.empty()#判读队列是否为空
- q.full()#判断队列是否满
- q.qsize()#获取当前队列大小
子进程与主进程通信
from multiprocessing import Process, Queue
def son_process(queue):
queue = queue.get()
print(queue)
def main_process():
queue = Queue()
task_list = []
for i in range(5):
queue.put(i)
task = Process(target=son_process, args=(queue,))
task.start()
task_list.append(task)
for task in task_list:
task.join()
if name == 'main':
main_process()
子进程与主进程通信
子进程之间通信
from multiprocessing import Process, Queue, Lock
def producer(name, queue):
for i in range(5):
queue.put(f'{name} putting')
print(f'{name} qsize:{queue.qsize()}')
def customer(name, queue, lock):
lock.acquire()
for i in range(5):
print(f'{name} getting:', queue.get())
lock.release()
def main():
queue = Queue(5)
lock = Lock()
task_producer_list = []
task_customer_list = []
for i in range(5):
task_producer = Process(target=producer, args=(f'producer_{i}', queue,))
task_producer.daemon = True
task_producer.start()
task_producer_list.append(task_producer)
for i in range(2):
task_customer = Process(target=customer, args=(f'customer_{i}', queue, lock))
# task_customer.daemon = True
task_customer.start()
task_customer_list.append(task_customer)
# for task in task_producer_list:
# task.join()
for task in task_customer_list:
task.join()
if name == 'main':
main()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)