Django + Celery + Scrapy扭曲反应堆(ReactorNotRestartable)和数据库(SSL错误)错误

时间:2018-03-18 11:48:09

标签: python django scrapy celery twisted

我有一个Django 2.0,Celery 4和Scrapy 1.5设置,我在django自定义命令中有一个Spider,我需要定期调用此命令,我使用Celery来调用这些命令,它们涉及到抓取一个网页并将一些结果保存到数据库中。这是我的文件:

get_data.py

class Command(BaseCommand):
    help = 'Crawl for new data'

    def handle(self, *args, **options):
        settings = Settings()
        settings.setmodule(crawler_settings)
        process = CrawlerProcess(settings=settings)
        args = {some needed args}
        process.crawl(DataLogSpider, kwargs=args)
        process.start()

celery.py

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')

app = Celery('config')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

tasks.py

@task()
def collect_data_information():
    call_command('get_data')

(Django)settings.py

CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_BEAT_SCHEDULE = {
    'task-get-logs': {
        'task': 'core.tasks.collect_data_information',
        'schedule': crontab(minute='*/15')  # every 15 minutes
    },
}

为了简单起见,我删除了一些导入并减少了代码。问题是,当我运行我的芹菜任务时,我的蜘蛛只会在第一次执行时,第二次出现ReactorNotRestartable错误。我知道问题来自Twisted反应器不止一次重启,这是不可能的。我已经查看了这些问题123以及涉及相同错误的许多其他问题,但在使用Django保存到数据库时,他们都没有考虑并发问题。

当我尝试将解决方案应用于我的问题时,我会收到django.db.utils.OperationalError: SSL error: decryption failed or bad record mac。我也查了一下,它是由打开数据库连接的多个进程引起的,这实际上是由于他们的解决方案而产生的。

所以我的问题归结为:Is there a way to run Celery+Scrapy+Django without having problems with the Twisted reactor being opened and finished multiple times?

1 个答案:

答案 0 :(得分:1)

我自己找到了解决方案。我必须通过芹菜设置文件添加以下内容:

app.conf.update(
    worker_max_tasks_per_child=1,
    broker_pool_limit=None
)

这告诉芹菜以干净的方式开始每项任务,因此每个任务都将在新流程中启动,并且ReactorNotRestartable问题不会发生。