首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解os.fork和Queue.Queue

了解os.fork和Queue.Queue
EN

Stack Overflow用户
提问于 2012-03-30 04:42:12
回答 3查看 4.4K关注 0票数 7

我想使用并行执行来实现一个简单的python程序。它有I/O限制,所以我认为线程是合适的(而不是进程)。在阅读了有关Queue和fork的文档后,我认为下面的内容可能会起作用。

代码语言:javascript
复制
q = Queue.Queue()

if os.fork():            # child
    while True:
        print q.get()
else:                    # parent
    [q.put(x) for x in range(10)]

但是,get()调用永远不会返回。我认为一旦另一个线程执行put()调用,它就会返回。使用线程模块,事情的表现更像我所期望的:

代码语言:javascript
复制
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方法不能做同样的事情。我遗漏了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-30 04:48:37

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

()函数将创建一个新进程。新进程(子进程)应是调用进程(父进程)的精确副本,除非如下所示:...

因此,在第一个示例中复制了Queue,而不是在父级和子级之间共享。

您可以使用multiprocessing.Queue,也可以只使用线程,如第二个示例所示:)

顺便说一句,使用列表理解只是为了副作用isn't good practice,有几个原因。您应该改用for循环:

代码语言:javascript
复制
for x in range(10): q.put(x)
票数 8
EN

Stack Overflow用户

发布于 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来写入管道。不要忘记关闭管道并捕获异常。

票数 1
EN

Stack Overflow用户

发布于 2012-03-30 04:49:00

Fork创建了一个新的进程。子进程和父进程不共享同一队列:这就是子进程无法检索父进程放入的元素的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9933206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档