我正在开发一个相当大的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