Skip to main content
 首页 » 编程设计

python之Django + Celery + Scrapy 扭曲 react 器(ReactorNotRestartable)和数据库(SSL 错误)错误

2025年01月19日23pander-it

我有一个 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 
    }, 
} 

为了简单起见,我删除了一些导入并减少了代码。问题是当我运行 celery 任务时,我的蜘蛛只会执行第一次,第二次我得到 ReactorNotRestartable 错误。我知道问题出在 Twisted reactor 不止一次重启,这是不可能的。我已经研究过这些问题 1 , 2 , 3和其他许多涉及相同错误的人一样,但他们都没有考虑使用Django 保存到数据库时的并发问题。

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

所以我的问题归结为:有没有一种方法可以运行 Celery+Scrapy+Django 而不会出现多次打开和完成 Twisted react 堆的问题?

请您参考如下方法:

我自己找到了解决方案。我必须将以下内容添加到 celery 设置文件中:

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

这告诉 celery 以干净的状态开始每个任务,因此每个任务都将在一个新进程中启动,并且不会发生 ReactorNotRestartable 问题。