, но, к сожалению, потоки/процессы запускаются только одновременно, если нет аргументов.
Нет, это не проблема.
Проблема в том, что вы вызываете 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()
Большое спасибо! Выработал для меня :) – Exceen