2014-07-03 28 views
0

我有一個功能,它裏面我使用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 

我的問題是「迴歸T」偏偏右後秒(從3)創建PID。在'for-loops'完成迭代之前。 我卡住了,完全不知道爲什麼會發生這種事......我做錯了什麼?

+1

你必須使用'os.wait()'等待孩子完成。否則,這兩個進程獨立運行。 – Barmar

+1

請參閱_Multiple Forks_示例:http://www.petercollingridge.co.uk/blog/running-multiple-processes-python – Barmar

+0

謝謝Barmar,你的建議幫助我,並在實現os.waitpid()後,我的函數不會停止在所有的pids完成他們的工作之前。但是正如user2040251在下面告訴的那樣,我得到的列表是空的,他是絕對正確的,我沒有提過它。所以我會盡我所能分享孩子和家長之間的數據。再次感謝你! – Desprit

回答

1

無論如何,此代碼將始終返回空列表。 fork創建一個新進程,它不會與父進程共享內存。也就是說,每個子進程修改它自己的t列表副本。您需要使用進程間通信來實際更新父進程中的t。

+0

謝謝先生,沒錯,​​我現在看到的清單是空的。你會如此友善地向我提供在兒童和父母之間分享數據的最佳方式嗎?這裏http://stackoverflow.com/questions/6227039/python-fork-passing-data-from-child-to-parent先生Gareth里斯告訴使用多處理模塊。這是正確的路嗎? – Desprit

+1

您可以使用管道或共享內存與mmap。很難說哪個最好,因爲它取決於。 – kraskevich

相關問題