Queue 进程间通信,多线程

#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`适用于需要方便地使用进程池来并行执行任务的场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值