Запустить 2 функции одновременно и параллельно?

у меня есть массив

myArray = array(url1,url2,...,url90)

Я хочу выполнить эту команду 3 раза параллельно

scrapy crawl mySpider -a links=url

и каждый раз с 1 URL,

scrapy crawl mySpider -a links=url1
scrapy crawl mySpider -a links=url2
scrapy crawl mySpider -a links=url3

и когда первый закончит свою работу, он получит другой URL-адрес, например

scrapy crawl mySpider -a links=url4

Я прочитал этот вопрос и этот, и я пробую это:

import threading
from threading import Thread

def func1(url):

    scrapy crawl mySpider links=url

if __name__ == '__main__':
    myArray = array(url1,url2,...,url90)
    for(url in myArray):
        Thread(target = func1(url)).start()

person parik    schedule 09.09.2016    source источник


Ответы (1)


Когда вы пишете target = func1(url), вы на самом деле запускаете func1 и передаете результат Thread (функция не является ссылкой). Это означает, что функции выполняются в цикле, а не в отдельном потоке.

Вам нужно переписать это так:

if __name__ == '__main__':
    myArray = array(url1,url2,...,url90)
    for(url in myArray):
        Thread(target=func1, args=(url,))).start()

Затем вы говорите Thread запустить func1 с аргументами (url,)

Также вы должны дождаться завершения потоков после цикла, иначе ваша программа завершится сразу после запуска всех потоков.

РЕДАКТИРОВАТЬ: и если вы хотите, чтобы одновременно запускались только 3 потока, вы можете использовать ThreadPool:

if __name__ == '__main__':
    from multiprocessing.pool import ThreadPool

    pool = ThreadPool(processes=3)
    pool.map(func, myArray)
person Pax0r    schedule 09.09.2016
comment
Когда первый закончил свою работу, он получает другой URL? , в своем редактировании вы не написали цикл for - person parik; 09.09.2016
comment
Да — ThreadPools создает 3 потока и pool.map запускает func для каждого элемента из myArray, используя эти потоки. Поэтому, когда один поток завершает свою работу, он запускает func со следующим URL-адресом из myArray. В этом случае вам не нужно писать «цикл for», так как map функций запускают его внутри. - person Pax0r; 09.09.2016