Django+celeri+crapy twisted reactor(reactor或不可重启)和数据库(SSL错误)错误

2024-04-19 20:58:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django 2.0,Celery 4和Scrapy 1.5的安装程序,其中我在Django自定义命令中有一个Spider,我需要定期调用这个命令,我使用Celery调用这些命令,它们涉及到抓取网页并将一些结果保存到数据库中。以下是我的档案:

得到_数据.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()

芹菜.py

^{pr2}$

任务.py

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

(Django)设置.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错误。我知道问题出在扭曲的反应堆不止一次重启,这是不可能的。我已经研究过这些问题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?


Tags: djangopy命令数据库taskdatainformationsettings
1条回答
网友
1楼 · 发布于 2024-04-19 20:58:08

我自己也找到了解决办法。我不得不通过芹菜设置文件添加以下内容:

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

这就告诉celery要一劳永逸地开始每一项任务,这样每个任务都会在一个新的过程中开始,并且不会出现ReactorNotRestartable的问题。在

相关问题 更多 >