Как запустить функцию другого модуля в новом процессе
Возникла проблема с асинхронностью кода на python. У нас есть бот, написанный на библиотеке aiogram. В нем необходимо создать процесс, в котором будет бесконечно выполнятся функция из другого модуля. Как это реализовать?
Вот код функции из другого модуля (parser), который нужно запустить в новом процессе:
async def main():
while True:
tasks = [
asyncio.create_task(parse_skysports()),
asyncio.create_task(parse_guardiansport()),
asyncio.create_task(parse_ign()),
asyncio.create_task(parse_stopgame()),
asyncio.create_task(parse_politico()),
asyncio.create_task(parse_voanews())
]
connection = db.DbConnection()
for result in await asyncio.gather(*tasks):
connection.update_data(paper_name=result[0], news=result[1])
time.sleep(20)
Эту функцию необходимо вызвать через asyncio.run() в основном модуле, но так, чтобы бот продолжал работать.
Вот такой подход не работал:
import parser
import asyncio
from aiogram import Bot, Dispatcher, executor, types
import multiprocessing as mp
...
def parsing():
asyncio.run(parser.main())
...
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
process = mp.Process(target=parsing)
process.start()
В данном случае бот работал, но функция из модуля parser не работала.
Заранее спасибо за помощь.
Ответы (1 шт):
Автор решения: Vasily
→ Ссылка
Вам нужно создать два процесса - с ботом и с while True: ...
def parsing():
asyncio.run(parser.main())
def start_bot():
executor.start_polling(dp, skip_updates=True)
и запустить два процесса:
if __name__ == '__main__':
bot_process = mp.Process(target=start_bot)
parser_process = mp.Process(target=parsing)
bot_process.join()
parser_process.join()