python语言windows进程池中的Queue消息队列,进程通信

用进程池建立两个进程,实现进程间互相接收发送消息。

如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到一条如下的错误信息:

RuntimeError: Queue objects should only be shared between processes through inheritance.

代码:

#coding=utf-8

#修改import中的Queue为Manager
from multiprocessing import Manager,Pool
import os,time,random

def reader(q,q2):
    print("reader启动(%s),父进程为(%s)"%(os.getpid(),os.getppid()))
    for i in range(q.qsize()):
        print("reader从Queue获取到消息:%s" % q.get(True))

def writer(q,q2):
    print("writer启动(%s),父进程为(%s)"%(os.getpid(),os.getppid()))
    xiaoxi=["在吗","明人不说暗话","还我钱"]
    for i in xiaoxi:
        q.put(i)

if __name__=="__main__":
    print("(%s) start"%os.getpid())
    q=Manager().Queue() #使用Manager中的Queue来初始化
    q2 = Manager().Queue()  # 使用Manager中的Queue来初始化
    po=Pool()
    #使用阻塞模式创建进程,这样就不需要在reader中使用死循环了,可以让writer完全执行完成后,再用reader去读取
    po.apply(writer,(q,q2))
    po.apply(reader,(q,q2))
    po.close()
    po.join()
    print("(%s) End"%os.getpid())
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python 中,可以使用 `multiprocessing` 库中的 `Queue` 类来在进程池中传递信息。 首先,在主进程中创建一个 `Queue` 对象,然后将该对象作为参数传递给进程池中的每个进程: ```python from multiprocessing import Queue, Process def worker(queue): # 从队列中获取信息 message = queue.get() # 处理信息 print(message) if __name__ == '__main__': # 创建一个队列 queue = Queue() # 创建进程池,并将队列作为参数传递给每个进程 with Process(target=worker, args=(queue,)) as process: # 向队列中添加信息 queue.put('Hello, World!') # 等待进程完成 process.join() ``` 在进程池中的每个进程中,可以使用 `Queue.get()` 方法从队列中获取信息,并使用 `Queue.put()` 方法向队列中添加信息。 注意,在使用进程池和队列时,应该使用 `multiprocessing` 库中的进程和队列,而不是 `threading` 库中的线程和队列。 ### 回答2: 在Python中使用进程池时,可以使用队列来传递信息。 首先,需要导入`multiprocessing`模块中的`Pool`和`Queue`。 使用`Pool`创建进程池对象,可以指定进程数。然后,使用`Queue`创建一个队列对象,用于在进程之间传递信息。 在主进程中,将需要传递的信息通过`put`方法放入队列中。 在子进程中,使用`get`方法从队列中取出信息。 下面是一个示例代码: ```python from multiprocessing import Pool, Queue def worker(queue): data = queue.get() # 从队列中取出信息 # 进行子进程的操作 if __name__ == '__main__': pool = Pool(processes=4) # 创建进程池,指定进程数为4 queue = Queue() # 创建队列对象 for i in range(10): queue.put(i) # 向队列中放入信息 pool.apply_async(worker, (queue,)) # 在进程池中异步执行worker函数 pool.close() # 关闭进程池 pool.join() # 等待所有子进程结束 ``` 在上面的示例代码中,创建了一个进程池对象`pool`,队列对象`queue`以及放入队列的信息。 然后,通过`apply_async`方法在进程池中异步执行`worker`函数,并将队列作为参数传递给子进程。 子进程中使用`get`方法从队列中取出信息。 最后,关闭进程池并等待所有子进程结束。 这样,就可以在Python中使用队列在进程池中传递信息了。 ### 回答3: 在Python中,在进程池中使用队列进行信息传递的方法如下: 首先,需要导入`multiprocessing`模块中的`Pool`类和`Queue`类: ```python from multiprocessing import Pool, Queue ``` 然后,创建一个共享队列对象: ```python queue = Queue() ``` 接下来,在进程池的任务函数中,通过将队列作为参数传递给进程池中的函数,在不同的进程之间进行信息传递: ```python def task_function(queue): # 在进程中需要传递的信息 message = "Hello from process {}".format(os.getpid()) # 将信息放入队列中 queue.put(message) # 创建进程池 pool = Pool() # 向进程池中添加任务 pool.apply_async(task_function, args=(queue,)) # 关闭进程池 pool.close() # 等待所有任务完成 pool.join() ``` 在上述代码中,我们调用了`apply_async`方法向进程池中添加任务,并将队列作为参数传递给任务函数`task_function`。然后,我们关闭进程池,并使用`join`方法等待所有任务的完成。 最后,可以通过在主进程中从队列中获取数据来获得在进程中传递的信息: ```python while not queue.empty(): message = queue.get() print(message) ``` 上述代码中的`queue.empty()`方法用于判断队列是否为空,`queue.get()`方法用于从队列中获取数据。 通过以上步骤,就可以在Python进程池中使用队列进行信息传递了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值