【问题标题】:Functions returns value before all fork() finish their tasks函数在所有 fork() 完成任务之前返回值
【发布时间】:2014-08-25 03:43:12
【问题描述】:

我有一个函数,我在其中使用 os.fork():

def translating(words):
    '''Translate words using API'''

    number_of_threads = 3
    t = []   #list to store translated words
    l = len(words_words)
    n = (l - (l % number_of_threads)) / number_of_threads   #number of words for each PID I will create


    for thread_number in range(number_of_threads):
        pid = os.fork()
        if pid != 0:
            '''print('Process {0} spawned' .format(pid))'''
        else:
            for i in words[thread_number*n:thread_number*n+n]:   #slice of words for each PID
                translation = translate.translate(i, 'en')['text']  #API returns list of translated words
                for a in translation:
                    t.append(a)
            os._exit(0)
    return t

我的问题是'return t' 发生在第二个(来自 3 个)PID 创建之后。在“for-loops”完成迭代之前。 我卡住了,完全不知道为什么会发生这种情况......我做错了什么?

【问题讨论】:

  • 您必须使用os.wait() 等待孩子完成。否则,这两个进程独立运行。
  • 在此处查看 Multiple Forks 示例:petercollingridge.co.uk/blog/running-multiple-processes-python
  • 谢谢 Barmar,您的建议帮助了我,并且在实现 os.waitpid() 之后,我的函数不会在所有 pid 完成工作之前停止。但是正如下面的user2040251所说,我得到的列表是空的,他是绝对正确的,我之前没有提到过。所以我会尽我所能在孩子和父母之间分享数据。再次感谢您!

标签: python fork


【解决方案1】:

无论如何,此代码将始终返回一个空列表。 fork 创建一个新进程,它不与父进程共享内存。也就是说,每个子进程都会修改自己的 t 列表副本。您需要使用进程间通信来实际更新父进程中的 t。

【讨论】:

  • 谢谢您,先生,这是真的,我现在看到的列表是空的。你能告诉我在孩子和父母之间分享数据的最佳方式吗?这里stackoverflow.com/questions/6227039/… Gareth Rees 先生告诉我们使用多处理模块。这是正确的方法吗?
  • 您可以通过 mmap 使用管道或共享内存。很难说哪个是最好的,因为这取决于。
猜你喜欢
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
相关资源
最近更新 更多