這裏就是我試圖完成 -蟒蛇 - >多模塊
- 我有一百萬個文件,我需要解析&追加解析的內容到一個文件中。
- 由於單個過程需要很長時間,因此此選項不可用。
- 在Python中不使用線程,因爲它實質上涉及運行單個進程(由於GIL)。
- 因此使用多處理模塊。即產生4個子過程,以利用所有原始核心功率:)
到目前爲止好,現在我需要一個共享對象,所有的子進程都可以訪問。我正在使用多處理模塊中的隊列。此外,所有子流程都需要將其輸出寫入單個文件。一個潛在的地方使用鎖我猜。有了這個設置,當我運行時,我沒有得到任何錯誤(所以父進程看起來很好),它只是停滯不前。當我按ctrl-C時,我看到一個回溯(每個子進程一個)。也沒有輸出寫入輸出文件。這裏的代碼(注意,沒有多進程運行良好) -
import os
import glob
from multiprocessing import Process, Queue, Pool
data_file = open('out.txt', 'w+')
def worker(task_queue):
for file in iter(task_queue.get, 'STOP'):
data = mine_imdb_page(os.path.join(DATA_DIR, file))
if data:
data_file.write(repr(data)+'\n')
return
def main():
task_queue = Queue()
for file in glob.glob('*.csv'):
task_queue.put(file)
task_queue.put('STOP') # so that worker processes know when to stop
# this is the block of code that needs correction.
if multi_process:
# One way to spawn 4 processes
# pool = Pool(processes=4) #Start worker processes
# res = pool.apply_async(worker, [task_queue, data_file])
# But I chose to do it like this for now.
for i in range(4):
proc = Process(target=worker, args=[task_queue])
proc.start()
else: # single process mode is working fine!
worker(task_queue)
data_file.close()
return
我做錯了什麼?我也嘗試在生成時將打開的file_object傳遞給每個進程。但沒有效果。例如 - Process(target=worker, args=[task_queue, data_file])
。但是這並沒有改變任何東西。我覺得由於某種原因,子進程無法寫入文件。要麼file_object
的實例沒有得到複製(在產卵時)或其他一些怪癖......任何人有一個想法?
另外:也有任何方法來保持一個持久的mysql_connection打開&傳遞給子進程嗎?所以我打開我的父進程中的mysql連接&打開的連接應該可以訪問我所有的子進程。基本上這相當於python中的shared_memory。這裏的任何想法?
如果你不寫入文件,但做一個打印,它的工作呢? (在Linux上我會做python script.py> out.dat以防止屏幕氾濫)。 – extraneon 2010-08-27 17:37:49
我認爲proc.start是非阻塞的,因此您可能應該等待某個地方讓流程有機會在做datafile.close() – extraneon 2010-08-27 17:42:30
data_file.close()的最後完成一些工作。它應該在這裏有效嗎?另外打印工作正常。當我使用print時,我在屏幕上看到輸出...但是我想使用文件。幫幫我! 也有沒有辦法保持一個持久的mysql_connection打開並傳遞給子進程? – 2010-08-27 17:47:00