BeautifulSoup в параллельном разборе - PullRequest
0 голосов
/ 16 марта 2019

У меня есть список файлов, которые я хочу проанализировать с BeautifulSoup. Бег

soup = BeautifulSoup(file, 'html.parser')

занимает около 2 секунд для каждого файла, так что

soups = []
for f in files:
    soups.append(BeautifulSoup(f, 'html.parser'))

занимает около 40 секунд. Я хотел бы запустить BeautifulSoup(file, 'html.parser') для каждого файла вместе, чтобы весь процесс завершился примерно через 2 секунды. Возможно ли это?

Я пробовал следующее, которое не работало:

async def parse_coroutine(F):
    return BeautifulSoup(F, 'html.parser')

async def parse(F):
    p = await parse_coroutine(F)
    return p

lst = [parse(f) for f in files]

async def main():
    await asyncio.gather(*lst)

asyncio.run(main())

1) BeautifulSoup(F, 'html.parser') выполняется до конца, и я не могу вызывать другие функции во время его выполнения

2) Приведенный выше код не дает мне того, что я хочу: я хочу, чтобы объекты, возвращенные BeautifulSoup(F, 'html.parser'), были сохранены в списке

Согласно этой , асинхронная синхронизация на самом деле не реализует параллельную обработку так, как я хочу. Так какие у меня варианты? Я хотел бы получить конкретное решение, если это возможно, потому что я не знаком с многопоточностью / параллельным программированием и т. Д.

...