views.py 中的子进程不起作用
Posted
技术标签:
【中文标题】views.py 中的子进程不起作用【英文标题】:subprocess in views.py does not work 【发布时间】:2014-04-15 01:27:49 【问题描述】:我需要一个函数,在开始用不同的摄像机录制一些视频之前启动几个 beanstalk 工作者。所有这些都在豆茎中起作用。由于我需要在录制视频之前启动工作人员,因此我想做一个子流程,但这不起作用。最奇怪的是,如果我在这个函数之外(在 shell 中)的不同 python 脚本中单独运行子进程,这可以工作!这是我的代码(不工作的那个):
os.chdir(path_to_the_manage.py)
subprocess.call("python manage.py beanstalk_worker -w 4",shell=True)
phase = get_object_or_404(Phase, pk=int(phase_id))
cameras = Video.objects.filter(phase=phase)
###########################################################################
## BEANSTALK
###########################################################################
num_workers = 4
time_to_run = 86400
[...]
for camera in cameras:
arg = phase_id +' '+settings.PATH_ORIGIN_VIDEOS +' '+camera.name
beanstalk_client.call('video.startvlcserver', arg=arg, ttr=time_to_run)
我想包含子流程,因为如果我必须在我想做的每条视频记录上运行 beanstalk 工作程序,这对我来说很烦人。
提前致谢。
【问题讨论】:
当您说它不起作用时,您是否收到错误消息?我假设 subprocess.call 只是返回假?您可能希望提供可以找到脚本的整个绝对路径。如果没有绝对路径,views.py 文件可能找不到它?我相信这就是我在我的 linode 服务器上使用 subprocess.checkoutput 时所做的。 我什么也没得到,它继续正常工作,但过了一会儿,当我不得不停止视频时,我用 os.kill 终止了进程,服务器抛出 500 错误原因该进程不存在(由于没有分配 beanstalk 工作人员,因此 beanstalk_client.call 尚未处理)。我正在使用 manage.py 的绝对路径。 也许这会对您有所帮助:***.com/questions/8494335/…。我在 python 2.7.3 上遇到了同样的问题。您可以通过更新软件和&或更改 mod_wsgi/apache 设置来克服它。最后我从 apache/mod_wsgi 切换到 nginx/uwsgi 并且再也没有遇到过。 【参考方案1】:我不太确定subproccess.call
是您要找的东西。我相信问题是子进程调用是同步的。它不会产生新进程,而是在 Web 请求的上下文中调用命令。这会占用资源,如果请求超时或用户取消,可能会发生奇怪的事情吗?
我从未使用过 beanstalkd,但是对于 celery(另一个作业队列),celeryd 工作进程始终在运行,等待作业。这使得使用 supervisord 管理起来很容易。如果您查看 beanstalkd 部署,如果他们建议做同样的事情,我不会感到惊讶。这应该包括在视图上下文之外启动您的 beanstalk 工作者。 从命令行
python manage.py beanstalk_worker -w 4
一旦您的 beanstalkd 工作人员设置并运行,您就可以在您的视图中使用异步 beanstalk api 调用将作业发送到队列
https://groups.google.com/forum/#!topic/django-users/Vyho8TFew2I
【讨论】:
以上是关于views.py 中的子进程不起作用的主要内容,如果未能解决你的问题,请参考以下文章