views.py中的子进程不起作用

时间:2014-03-11 12:24:14

标签: python django subprocess beanstalkd

在开始使用不同的摄像头录制一些视频之前,我需要一个启动多个beanstalk工作者的函数。所有这些都在beanstalk中起作用。因为我需要在视频记录之前启动工作程序,我想做一个子进程,但这不起作用。最奇怪的是,如果我在这个函数之外的另一个python脚本中运行子进程(在shell中),这是有效的!这是我的代码(不起作用的代码):

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 worker,这对我来说很烦人。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我不太确定subproccess.call是您正在寻找的。我相信问题是subproccess调用是同步的。它不会产生新进程,但会在Web请求的上下文中调用该命令。这会占用资源,如果请求超时或用户取消,可能会发生奇怪的事情?

我从未使用过beanstalkd,但是对于芹菜(另一个作业队列),celeryd工作进程总是在运行,等待工作。这使得使用supervisord轻松管理。如果你看看beanstalkd部署,如果他们建议做同样的事情,我不会感到惊讶。这应该包括在视图上下文之外启动beanstalk工作者。 从命令行

python manage.py beanstalk_worker -w 4

设置并运行beanstalkd worker后,您可以使用async beanstalk api调用从您的视图中将作业发送到队列

https://groups.google.com/forum/#!topic/django-users/Vyho8TFew2I