Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数在所有fork()完成任务之前返回值_Python_Fork - Fatal编程技术网

Python 函数在所有fork()完成任务之前返回值

Python 函数在所有fork()完成任务之前返回值,python,fork,Python,Fork,我有一个函数,其中使用的是os.fork(): 我的问题是“return t”发生在创建第二个(从3开始)PID之后。在“for循环”之前完成迭代。 我陷入困境,完全不知道为什么会发生这种情况。。。我做错了什么?无论如何,此代码将始终返回空列表。fork创建一个新进程,它不与父进程共享内存。也就是说,每个子进程都修改自己的t列表副本。您需要使用进程间通信来实际更新父进程中的t。您必须使用os.wait()来等待子进程完成。否则,这两个进程将独立运行。请参见此处的多个Forks示例:谢谢Barma

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

我的问题是“return t”发生在创建第二个(从3开始)PID之后。在“for循环”之前完成迭代。
我陷入困境,完全不知道为什么会发生这种情况。。。我做错了什么?

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

您必须使用
os.wait()
来等待子进程完成。否则,这两个进程将独立运行。请参见此处的多个Forks示例:谢谢Barmar,您的建议帮助了我,在实现os.waitpid()之后,我的函数不会在所有PID完成其工作之前停止。但正如下面的用户2040251所说,我得到的列表是空的,他是绝对正确的,我以前没有提到过。所以我会尽我所能在孩子和父母之间共享数据。再次感谢你!谢谢你,先生,这是真的,我现在看到的名单是空的。您能告诉我在孩子和家长之间共享数据的最佳方式吗?这里Gareth Rees先生告诉我们使用多处理模块。这是正确的方法吗?您可以使用管道或mmap共享内存。很难说哪一个是最好的,因为这要看情况而定。
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