python队列长度不限制_python – 多处理的最大大小.Queue项目?

我正在开发一个相当大的Python项目,需要将一个计算密集型后台任务卸载到另一个核心,这样主服务就不会变慢.当使用multiprocessing.Queue来传达工作进程的结果时,我遇到了一些显然很奇怪的行为.对于threading.Thread和multiprocessing.Process使用相同的队列进行比较,线程工作正常,但是在将大项放入队列后,进程无法加入.注意:

import threading

import multiprocessing

class WorkerThread(threading.Thread):

def __init__(self, queue, size):

threading.Thread.__init__(self)

self.queue = queue

self.size = size

def run(self):

self.queue.put(range(size))

class WorkerProcess(multiprocessing.Process):

def __init__(self, queue, size):

multiprocessing.Process.__init__(self)

self.queue = queue

self.size = size

def run(self):

self.queue.put(range(size))

if __name__ == "__main__":

size = 100000

queue = multiprocessing.Queue()

worker_t = WorkerThread(queue, size)

worker_p = WorkerProcess(queue, size)

worker_t.start()

worker_t.join()

print 'thread results length:', len(queue.get())

worker_p.start()

worker_p.join()

print 'process results length:', len(queue.get())

我已经看到这适用于size = 10000,但是在worker_p.join()中挂起size = 100000.对于multiprocessing.Process实例可以放入多处理.Queue中是否有一些固有的大小限制?或者我在这里犯了一些明显的,根本性的错误?

作为参考,我在Ubuntu 10.04上使用Python 2.6.5.

解决方法:

似乎底层管道已满,因此馈线线程在写入管道时阻塞(实际上在尝试获取保护管道不受并发访问的锁定时).

标签:python,multithreading,multiprocessing,queue

来源: https://codeday.me/bug/20191005/1854959.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用`multiprocessing.apply_async`函数处理多个`multiprocessing.Manager.Queue()`的示例代码: ```python import multiprocessing def worker(q1, q2): while True: item = q1.get() if item is None: break # 处理item result = item + 1 q2.put(result) if __name__ == '__main__': manager = multiprocessing.Manager() q1 = manager.Queue() q2 = manager.Queue() # 启动worker进程 p = multiprocessing.Process(target=worker, args=(q1, q2)) p.start() # 向队列q1中添加数据 for i in range(10): q1.put(i) # 添加结束标记 q1.put(None) # 从队列q2中读取结果 results = [] for i in range(10): result = q2.get() results.append(result) # 等待worker进程结束 p.join() print(results) ``` 在示例代码中,我们首先创建了两个`multiprocessing.Manager.Queue()`对象:`q1`和`q2`。然后我们启动了一个worker进程,将`q1`和`q2`作为参数传递给worker函数。在worker函数中,我们使用无限循环来不断地从`q1`队列中读取数据,并对每个数据进行处理,然后将结果放入`q2`队列中。当从`q1`中取到None时,说明数据已经全部处理完毕,此时退出循环。 在主进程中,我们向`q1`队列中添加10个数据,并在最后添加一个None作为结束标记。然后我们使用循环从`q2`队列中读取结果,并将结果保存到一个列表中。最后我们等待worker进程结束,并输出结果列表。 需要注意的是,`multiprocessing.Manager.Queue()`对象是进程安全的队列,可以在多个进程之间共享数据。在上面的示例代码中,我们通过`multiprocessing.Process`函数启动了一个worker进程,并将`q1`和`q2`队列作为参数传递给worker函数。在worker函数中,我们可以直接使用`q1`和`q2`队列来进行数据的读取和写入。这样就可以实现多个进程之间的通信和协作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值