在Django3.2.3和Python3.7.9中,我尝试使用uWSGI后台处理程序而不是芹菜来运行并发任务。我已经找到了一些资源,比如this、this、和this,但都不起作用。在这段旅程中,我遇到了许多错误,我已经使用我在网上找到的解决方案修复了这些错误,现在我得到的是:
[uwsgi]
pythonpath = /path/to/djproj
wsgi-file = /path/to/djproj/wsgi.py
uid = myuid
module = wsgi:application
master = true
processes = 1
threads = 10
lazy-apps = true
http = 0.0.0.0:8080
vacuum = true
log-format = %(ltime) Worker: %(wid) %(status) %(method) %(uri) Size: %(size)
log-date = %%Y %%m %%d %%H:%%M:%%S.000
# Let django handle most of the logging
disable-logging = true
log-5xx = true
harakiri = 60
harakiri-verbose = true
stats = /tmp/djproj_stats.socket
# Spooling
spooler = /path/to/tasks
spooler-harakiri = 600
import = djproj.tasks
import logging
logger = logging.getLogger(__name__)
try:
from uwsgidecorators import spool
logger.warning("Imported spool successfully.")
except Exception:
logger.warning("Couldn't import spool.")
def spool(func):
def func_wrapper(**arguments):
return func(arguments)
return func_wrapper
@spool
def run_task(arguments):
logger.warning("Running in spool.")
from djproj.myapp.models import MyModel
obj = MyModel.objects.get(id=arguments["obj_id"])
obj.run()
# ...
def prepare_spooler_args(**kwargs):
args = {}
for name, value in kwargs.items():
args[name.encode("utf-8")] = str(value).encode("utf-8")
return args
class MyModel(models.Model):
# ...
def start_run_in_spooler(self):
args = prepare_spooler_args(task_id=self.id)
run_task(args)
当我运行uwsgi --ini uwsgi.ini
并访问触发此代码的端点时,我得到:
...
2021 09 20 12:56:20.000 - *** Stats server enabled on /tmp/djproj_stats.socket fd: 16 ***
2021 09 20 12:56:20.000 - spawned uWSGI http 1 (pid: 919)
2021 09 20 12:56:20.000 - [spooler /path/to/tasks pid: 917] managing request uwsgi_spoolfile_on_5a22c167ad32_826_2_189168444_1632124468_886229 ...
2021 09 20 12:56:20.000 - unable to find the spooler function, have you loaded it into the spooler process ?
我觉得很奇怪,网上很少有关于如何使这项工作有效的资源。每次我寻找解决方案时,每个人都会推荐芹菜,就像它是任何Python应用程序中并发性的银弹一样,尽管Django+uWSGI是一个非常常见的组合,而且Spooler似乎是一个简单而轻量级的解决方案。如果有人对如何让它工作有任何建议,那就太棒了
在同事的帮助下,我们终于成功了。以下是必要的更改:
uwsgi.ini
import = djproj.tasks
更改为spooler-import = djproj.tasks
tasks.py
导入必须移出假脱机函数,Django需要初始化,导入才能工作。以下是代码的最终版本:
models.py和views.py
调用假脱机函数的模型方法已删除。相反,我们只是在视图中直接调用假脱机函数:
希望这对任何面临类似问题的人都有用
相关问题 更多 >
编程相关推荐