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

标签 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
    },
}

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

当我尝试将他们的解决方案应用于我的问题时,我收到django.db.utils.OperationalError:SSL错误:解密失败或坏记录mac。我也查了一下,这是由打开数据库连接的多个进程引起的,这实际上是由于他们的解决方案而发生的。

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

最佳答案

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

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

这告诉 celery 从头开始​​启动每个任务,因此每个任务都将在一个新进程中启动,并且不会出现 ReactorNotRestartable 问题。

关于python - Django + Celery + Scrapy 扭曲 react 器(ReactorNotRestartable)和数据库(SSL 错误)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49347506/

相关文章:

django - 从 Form 获取 Model 实例而不保存

django - VSCode + 远程开发 + django : avoiding forwarding ports

python - scrapy 从路径运行蜘蛛

python - 如何解决 pymysql.err.ProgrammingError : 1064 - save data on mysql?

python - 有些网站被普通浏览器屏蔽,但在隐身模式下运行良好

python - 如何清除 multiprocessing.Queue?

python - 使用 Python : TypeError: an integer is required (got type socket) 的 HTTP 请求

python - django MEDIA_ROOT 和 MEDIA_URL 模板

Python 文档字符串 : inconsistent leading whitespace error without new line

python - 预期的 LP_c_float 实例而不是 glVertex3fv 中的元组