@zlodiak

Почему запросы выполняются последовательно?

Есть класс, который парсит некоторый контент. Я инициализирую его определённой ссылкой на страничку, он отрабатывает и выводит результат в консоль.

так как ссылок на страницы много, то я попытался распараллелить этот процесс при помощи цикла:
from multiprocessing import Process

for link in links:
    img_recognizer = ImgRecognizer(someArgs)

    proc = Process(target=img_recognizer.get_phone())
    procs.append(proc)
    proc.start()

for proc in procs:
    proc.join()

Подскажите пожалуйста почему следующий код выполняет запросы не параллельно, а последовательно. Это выражается в том, что после запуска программы селениум открывает браузер и парсит контент(это мне видно ка кпользователю). Как только парс завершается, то селениум закрывает окно браузера и открывает новое. То же самое повторяется и далее.

Используя пакет multiprocessing, я рассчитывал, что почти одновременно откроются несколько окон. Однако этого не произошло и я не понимаю почему

UPD: при этом если всё то же самое делаю через пакет threading, то описанной проблемы не возникает
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ответы на вопрос 1
Kurku
@Kurku
Погромист
Читай документацию:
>>> help(Process.join)
join(self, timeout=None)
    Wait until child process terminates

Это значит, что интерпретатор будет ждать пока процесс закончится.
То есть ты в своем коде на самом деле выполняешь все последовательно.
А тебе надо писать что-то такое:
from multiprocessing import Process
from time import sleep
     
def worker(n):
    print("the worker went to the office")  
    sleep(n)
    print("the worker has been walking for %d sec" % n)
     
if __name__ == "__main__":
    plist = [] 
    for i in range(4, 0, -1):
        proc = Process(target=worker, args=(i,))
        plist.append(proc)
     
    for proc in plist:
        proc.start()

Это возвратит:

the worker went to the office
the worker went to the office
the worker went to the office
the worker went to the office
the worker has been walking for 1 sec
the worker has been walking for 2 sec
the worker has been walking for 3 sec
the worker has been walking for 4 sec

И да, процессы и потоки вещи совсем разные. С потоками работать намного удобнее. Так почему бы не использовать их.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы