我想使用python的多处理模块运行多个gearman worker进程,但似乎进程正在顺序模式下执行。如果我在几个终端中运行单独的worker.py程序,那么它运行正常。但我想减轻在很多终端中手动指定worker.py的负担。有没有替代方案呢?
import sys , os , simplejson
from fabric import *
from fabric.api import *
import gearman
from gearman import GearmanWorker
from multiprocessing import Pool
##--Global Variables--##
#Spawing minimun 5 worker threads for Gearman
#executing the Job. gmJob consist of dict[host , cmd , pass]
def exe_job(gmWorker , gmJob ):
print " the worker process is " , os.getpid()
d = simplejson.loads(gmJob.data)
env.host_string = d['host']
env.password = d['pass'] #will store the password .
cmds = d['cmd']
print cmds
for i in cmds:
sudo (i ) # using fabric functions to ssh into system
return "job sucessfull"
def start_exe():
#woker node id to be specified in here
gm_worker = gearman.GearmanWorker(['localhost:4730'])
#gm_worker.set_client_id('client1')
gm_worker.register_task('exe_job',exe_job)
gm_worker.work()
if __name__ == '__main__':
p = Pool(5)
result = p.apply_async(start_exe)
print result.get()
答案 0 :(得分:1)
我也找不到这个问题的答案,所以我挖掘了一些事情并发现你基本上必须使用一个队列来跟踪你打开哪些进程以及哪些进程已经关闭(如果是一个错误的话)齿轮工人)。无论如何,我把它构建成一个模块并将其发布在pypi上。它仍然是一项正在进行中的工作,但我会在第二天左右尝试添加文档和示例:
我还包括通过json进行通信的客户端和工作类(我提到这个因为你的例子似乎使用了json)。
让我知道你的想法。我绝对可以使用更多的眼睛来查找错误或告诉我在哪里做了一些完全疯狂的代码。