我想使用并行执行来实现一个简单的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)]但是,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)]我只是不明白为什么fork方法不能做同样的事情。我遗漏了什么?
发布于 2012-03-30 04:48:37
POSIX fork系统调用在相同的地址空间中创建一个新进程,而不是一个新线程:
()函数将创建一个新进程。新进程(子进程)应是调用进程(父进程)的精确副本,除非如下所示:...
因此,在第一个示例中复制了Queue,而不是在父级和子级之间共享。
您可以使用multiprocessing.Queue,也可以只使用线程,如第二个示例所示:)
顺便说一句,使用列表理解只是为了副作用isn't good practice,有几个原因。您应该改用for循环:
for x in range(10): q.put(x)发布于 2014-01-27 06:42:30
要在不相关的进程之间共享数据,可以使用命名管道。通过os.open()函数..http://docs.python.org/2/library/os.html#os.open。您可以简单地将管道命名为named_ pipe ='my_pipe‘,然后在不同的python程序中使用os.open(named_pipe,),其中模式是WRONLY,依此类推。在此之后,您将创建一个FIFO来写入管道。不要忘记关闭管道并捕获异常。
发布于 2012-03-30 04:49:00
Fork创建了一个新的进程。子进程和父进程不共享同一队列:这就是子进程无法检索父进程放入的元素的原因。
https://stackoverflow.com/questions/9933206
复制相似问题