Bri*_*ins 6 python queue multithreading fork
我想用并行执行实现一个简单的python程序.它是I/O绑定的,所以我认为线程是合适的(而不是进程).在阅读了Queue和fork的文档之后,我认为以下内容可能会起作用.
q = Queue.Queue()
if os.fork(): # child
while True:
print q.get()
else: # parent
[q.put(x) for x in range(10)]
Run Code Online (Sandbox Code Playgroud)
但是,get()调用永远不会返回.我认为一旦另一个线程执行put()调用它就会返回.使用线程模块,事情表现得更像我的预期:
q = Queue.Queue()
def consume(q):
while True:
print q.get()
worker = threading.Thread (target=consume, args=(q,))
worker.start()
[q.put(x) for x in range(10)]
Run Code Online (Sandbox Code Playgroud)
我只是不明白为什么fork方法不会做同样的事情.我错过了什么?
POSIX fork系统调用创建一个新进程,而不是同一个地址空间内的新线程:
fork()函数将创建一个新进程.新流程(子流程)应是调用流程(父流程)的精确副本,除非详述如下:[...]
因此,Queue在您的第一个示例中重复,而不是在父级和子级之间共享.
您可以使用multiprocessing.Queue替代或只使用第二个示例中的线程:)
顺便说一下,出于几个原因,仅仅为了副作用而使用列表推导并不是好的做法.你应该使用一个for循环:
for x in range(10): q.put(x)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4032 次 |
| 最近记录: |