2014-10-20 4 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() 

Или, вы всегда можете построить функцию без аргументов с lambda или partial, конечно:

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

В качестве примечания, просто создавая, начиная и протечки куча дочерних процессов - плохая идея. Вероятно, вы хотите сохранить их все в списке, а затем join их всех (сразу или позже). Например:

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

1

Вы хотите аргумент арг ключевое слово:

Process(target = standard_download, args=(link,)).start() 
Смежные вопросы