在开始使用不同的摄像头录制一些视频之前,我需要一个启动多个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,这对我来说很烦人。
提前致谢。
答案 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