#Queue 进程间通信 from multiprocessing import Process, Queue import os, time, random import threading # 写数据的进程 def write(q,w_PID): # print(w_PID,type(w_PID)) print(f'{w_PID} 写线程PID:{os.getpid()}') for value in ['I', 'Love', 'Python']: print('放入队列:%s,时间:%s' % (value, time.time())) q.put(value) time.sleep(random.random()) # 读数据的进程: def read(q,w_PID): print('%d 读线程PID:%s' % (w_PID,os.getpid())) while True: value = q.get(True) print('获得数据:%s,时间:%s' % (value, time.time())) time.sleep(0.2) if q.empty(): #给定结束条件 return def getWrite(q): print('写进程PID:%s' % os.getpid()) w_PID = os.getpid() print("w_PID:",w_PID,"type:",type(w_PID)) #创建线程 t = threading.Thread(target=write,args=(q,w_PID)) t.start() t.join() def getRead(q): print('读进程PID:%s' % os.getpid()) w_PID = os.getpid() #创建线程 t = threading.Thread(target=read,args=(q,w_PID)) t.start() t.join() if __name__ == '__main__': print('主进程:',os.getpid()) # 父进程创建Queue,并传给各个子进程 q = Queue() pw = Process(target=getWrite, args=(q,)) #创建子进程 pw1 = Process(target=getWrite, args=(q,)) #创建子进程 # pt = threading.Thread(target=write,args=(q,)) #进程号跟随主进程 pr = Process(target=getRead, args=(q,)) pw.start() pw1.start() # pt.start() pr.start() # pw.join() pw1.join() # pr.start() # pt.join() # pr.terminate() # pr进程是死循环,无法等待其结束,只能强行终止
开启多进程方式:
`multiprocessing.Process`和`pool.apply_async`都是Python多进程编程中常用的工具,用于实现并行计算。它们之间的区别主要体现在以下几个方面:
1. 功能不同:
- `multiprocessing.Process`是一个类,用于创建新的进程,并在新的进程中执行指定的函数。
- `pool.apply_async`是`multiprocessing.Pool`类中的一个方法,用于在进程池中异步地执行函数。
2. 使用方式不同:
- `multiprocessing.Process`需要手动创建新的进程,并在该进程中执行指定的函数。可以使用`start()`方法启动新进程,使用`join()`方法等待新进程执行完成。
- `pool.apply_async`通过将函数和参数提交给进程池,自动创建新的进程,并在其中执行函数。函数的执行结果可以通过`get()`方法获取,但只能一个一个地获取。
3. 灵活性不同:
- `multiprocessing.Process`可以灵活地控制每个新进程的调度和运行。
- `pool.apply_async`将函数和参数交给进程池,由进程池自动管理和调度。
4. 并行度不同:
- `multiprocessing.Process`可以同时创建多个进程,每个进程都有独立的系统资源。
- `pool.apply_async`将函数和参数提交给进程池,进程池内部会自动分配可用的进程来执行任务。进程池的大小可以通过参数指定,决定了可以同时执行的任务数量。
总结来说,`multiprocessing.Process`适用于需要手动控制进程的创建和调度的场景,而`pool.apply_async`适用于需要方便地使用进程池来并行执行任务的场景