Проблемы с использованием многопроцессорной обработки, функции генератора и чистящих URL - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь быстро обработать несколько URL-адресов с помощью многопроцессорной обработки, но результаты, похоже, не загружаются в мою базу данных. Вот мой код:

def parse(url):
    page = requests.get(url, headers=headers)
    soup = BeautifulSoup(page.text, 'lxml')
    MongoDBCollection.insert_one(soup)

def gen_func():
    for document in otherMongoDBCollection:
        yield document['URL']

def main():
    pool = Pool(64)
    pool.imap_unordered(parse, gen_func())
    pool.terminate()
    pool.join()

if __name__ == "__main__":  # Required logic expression
    main()

1 Ответ

1 голос
/ 26 января 2020

Метод Pool.imap_unoredred возвращается немедленно, а не только после завершения работы. Его возвращаемое значение является итератором (таким образом, префикс «i»), и вы должны перебирать все возвращаемые значения, чтобы знать, что вся партия была обработана. Если вы хотите дождаться завершения всей работы, прежде чем основной процесс продолжит работу, вы, вероятно, захотите вместо этого использовать метод map (как вы упомянули, найдя в комментарии).

В качестве альтернативы вы может заменить звонок на terminate() звонком close(). Это не остановит работу пула (просто предотвратит отправку новых заданий). Вызов join() будет блокироваться, пока все рабочие не закончат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...