了解os.fork和Queue.Queue

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方法不会做同样的事情.我错过了什么?

Nik*_* B. 7

POSIX fork系统调用创建一个新进程,而不是同一个地址空间内的新线程:

fork()函数将创建一个新进程.新流程(子流程)应是调用流程(父流程)的精确副本,除非详述如下:[...]

因此,Queue在您的第一个示例中重复,而不是在父级和子级之间共享.

您可以使用multiprocessing.Queue替代或只使用第二个示例中的线程:)

顺便说一下,出于几个原因,仅仅为了副作用使用列表推导并不是好的做法.你应该使用一个for循环:

for x in range(10): q.put(x)
Run Code Online (Sandbox Code Playgroud)