2014-10-20 35 views
0

我有一個Python腳本,我想同時運行兩個方法。我嘗試了以下,但不幸的是,如果沒有參數,線程/進程只能同時運行。那我該如何解決這個問題呢?同時運行兩個方法(帶參數)?

from multiprocessing import Process 
def download_from_file(filename): 
    if os.path.exists(filename): 
     links = [line.strip() for line in open(filename)] 

     for link in links: 
      Process(target = standard_download(link)).start() 

回答

1

但不幸的是,線程/進程只能同時運行,如果沒有說法。

不,這不是問題。

問題是,你打電話給standard_download(link),然後將該調用的結果作爲target參數傳遞。這不是你想要的;您想要將函數本身和參數傳遞給Process對象,以便它可以調用它們。這正是args參數的用途,如most of the examples for multiprocessing所示。你的情況:

Process(target=standard_download, args=(link,)).start() 

或者,你總是可以建立一個零參數函數lambdapartial,當然:

Process(target=functools.partial(standard_download, link)).start() 

作爲一個側面說明,剛剛創建,啓動和滲出一堆兒童進程是一個壞主意。您可能希望將它們全部存儲在列表中,然後將它們全部(不管是立即還是稍後)都存儲起來。例如:

def download_from_file(filename): 
    if os.path.exists(filename): 
     links = [line.strip() for line in open(filename)] 

     for link in links: 
      p = Process(target=standard_download, args=(link,)) 
      p.start() 
      yield p 

processes = list(download_from_file(filename)) 
# later, when we need to wait until we're done with all the downloads 
for process in processes: 
    process.join() 
+0

非常感謝!爲我工作:) – Exceen 2014-10-20 20:48:05

1

你想要的ARGS關鍵字參數:

Process(target = standard_download, args=(link,)).start()