我有一个本地 readthedocs 安装,并在尝试导入项目时收到 ValueError 异常。我使用的是 5.1.0 版,在 Debian buster 上运行 python 3.6 和芹菜 4.1.1(来自需求文件(。
从调试.log:
[19/May/2020 23:31:11] celery.app.trace:124[24]: INFO Task readthedocs.projects.tasks.send_notifications[39551573-cfe1-46c1-b7e2-28bde20fd962] succeeded in 0.005342413205653429s: None
[19/May/2020 23:31:11] celery.app.trace:124[24]: INFO Task readthedocs.oauth.tasks.attach_webhook[119bed10-cacc-450c-bd51-822e96faffd7] succeeded in 0.016763793770223856s: False
[19/May/2020 23:31:11] celery.app.trace:249[24]: ERROR Task readthedocs.projects.tasks.update_docs_task[b6c22791-f1c6-4ddb-b64a-68d141580c30] raised unexpected: ValueError('signal only works in main thread',)
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/celery/app/trace.py", line 375, in trace_task
R = retval = fun(*args, **kwargs)
File "/readthedocs.org/readthedocs/projects/tasks.py", line 448, in update_docs_task
signal.signal(signal.SIGTERM, sigterm_received)
File "/usr/local/lib/python3.6/signal.py", line 47, in signal
handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
ValueError: signal only works in main thread
我正在使用manage.py runserver
来运行readthedocs,所以我尝试了--noreload
选项,它不起作用,以及--nothreading
选项,它会导致页面永远挂起。
为了使本地安装正常工作,您需要运行一个芹菜工人,这是我以前没有做的(并且不在 readthedocs 文档中(。我正在使用 docker compose,并运行了一个名为celery
的单独服务,该服务使用与主 readthedocs 服务相同的映像(安装 django 和 readthedocs 的自定义 docker 映像(。
celery -A readthedocs.worker worker -E -l info -Q celery,web
此外,我的 Django 配置中有这些设置:
BROKER_URL = os.getenv('REDIS_URL')
CELERY_RESULT_BACKEND = os.getenv('REDIS_URL')
CELERY_ALWAYS_EAGER = False
我的撰写配置中有一个简单的 redis 服务:
redis:
image: redis
然后,我将REDIS_URL=redis://redis:6379/0
作为环境变量在我的阅读文档和芹菜服务中。
有点无关,但我也停止使用python manage.py runserver
并将其替换为 uwsgi 进行生产。
uwsgi
--http :80
--wsgi-file readthedocs/wsgi.py
--static-map /static=./static
--master --processes 4 --threads 2