Запуск Scrapy с помощью очереди задач

Я создал веб-краулер с помощью Scrapy и Django и поместил код CrawlerRunner в очередь задач. На моей локалке все работает нормально, пока не запустил задачи на сервере. Я думаю, что проблема вызвана несколькими потоками.

Это код задачи, я использую huey для задач

from huey import crontab
from huey.contrib.djhuey import db_periodic_task, on_startup
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from scrapy.utils.project import get_project_settings
from twisted.internet import reactor

from apps.core.tasks import CRONTAB_PERIODS
from apps.scrapers.crawler1 import Crawler1
from apps.scrapers.crawler2 import Crawler2
from apps.scrapers.crawler3 import Crawler3



@on_startup(name="scrape_all__on_startup")
@db_periodic_task(crontab(**CRONTAB_PERIODS["every_10_minutes"]))
def scrape_all():
    configure_logging()
    settings = get_project_settings()

    runner = CrawlerRunner(settings=settings)

    runner.crawl(Crawler1)
    runner.crawl(Crawler2)
    runner.crawl(Crawler3)

    defer = runner.join()
    defer.addBoth(lambda _: reactor.stop())

    reactor.run()

и это первая ошибка, которую я получаю от sentry.io, она усечена

Unhandled Error
Traceback (most recent call last):
  File "/home/deployer/env/lib/python3.10/site-packages/twisted/internet/base.py", line 501, in fireEvent
    DeferredList(beforeResults).addCallback(self._continueFiring)
  File "/home/deployer/env/lib/python3.10/site-packages/twisted/internet/defer.py", line 532, in addCallback
    return self.addCallbacks(callback, callbackArgs=args, callbackKeywords=kwargs)
  File "/home/deployer/env/lib/python3.10/site-packages/twisted/internet/defer.py", line 512, in addCallbacks
    self._runCallbacks()
  File "/home/deployer/env/lib/python3.10/site-packages/twisted/internet/defer.py", line 892, in _runCallbacks
    current.result = callback(  # type: ignore[misc]
--- <exception caught here> ---
  File "/home/deployer/env/lib/python3.10/site-packages/twisted/internet/base.py", line 513, in _continueFiring
    callable(*args, **kwargs)
  File "/home/deployer/env/lib/python3.10/site-packages/twisted/internet/base.py", line 1314, in _reallyStartRunning
    self._handle...

задание установлено на выполнение каждые 10 минут, на втором запуске я получаю эту ошибку от sentry.io

ReactorNotRestartable: null
  File "huey/api.py", line 379, in _execute
    task_value = task.execute()
  File "huey/api.py", line 772, in execute
    return func(*args, **kwargs)
  File "huey/contrib/djhuey/__init__.py", line 135, in inner
    return fn(*args, **kwargs)
  File "apps/series/tasks.py", line 31, in scrape_all
    reactor.run()
  File "twisted/internet/base.py", line 1317, in run
    self.startRunning(installSignalHandlers=installSignalHandlers)
  File "twisted/internet/base.py", line 1299, in startRunning
    ReactorBase.startRunning(cast(ReactorBase, self))
  File "twisted/internet/base.py", line 843, in startRunning
    raise error.ReactorNotRestartable()

Предположим, что при первом запуске витой реактор не убил себя, и через 10 минут Хьюи пытается запустить витой реактор снова и терпит неудачу.

Я не разбираюсь в многопоточности, но я предполагаю, что task runner и twisted работают в разных потоках и не могут взаимодействовать друг с другом.

Есть советы?

Вернуться на верх