在python中使用多处理时遇到了这个问题。
我有一个python脚本,并行调用7个函数。这7个函数再次调用5个函数,每个函数都是相同的。这5个子函数使用Elastic Search
将结果返回到父函数。从这个父函数中,结果被返回到最顶层的父函数。因此,当我调用顶级父脚本时,将并行创建35个线程(所需)。
现在脚本似乎并行运行,我只有一个ES集群(我的PC)和一个节点。我搜索了一下并理解该节点被第一个使用ES的线程锁定并且下一个线程开始。我需要在群集中有更多节点。
node.name: "Data one"
node.master: true
node.data: false
node.name: "Data Two"
node.master: false
node.data: true
node.name: "Data Three"
node.master: false
node.data: true
在我以这种方式创建节点后,我的疑问是如何让我的线程知道要使用哪个节点并仅在该节点上创建索引。这样吗? :
es_client=ElasticSearch(['Node One']) //'Node Two' 'Node Three' and so on for the rest of the threads?
我试图找出代码为什么逐个执行线程。任何帮助将非常感激。我在某处的理解错了吗? 谢谢大家阅读这篇长篇文章。
编辑:使用代码格式
" grandparentscript.py"
func_topmostscript():
q1=Queue.queue()
p1=Process(target=func_fieldfunction(field1,q1)).start()
a=q1.get()
q2=Queue.queue()
p2=Process(target=func_fieldfunction(field2,q2)).start()
b=q2.get()
q3=Queue.queue()
p3=Process(target=func_fieldfunction(field3,q3)).start()
c=q3.get()
q4=Queue.queue()
p4=Process(target=func_fieldfunction(field4,q4)).start()
d=q4.get()
q5=Queue.queue()
p5=Process(target=func_fieldfunction(field5,q5)).start()
e=q5.get()
q6=Queue.queue()
p6=Process(target=func_fieldfunction(field6,q6)).start()
f=q6.get()
q7=Queue.queue()
p7=Process(target=func_fieldfunction(field7,q7)).start()
g=q7.get()
//Do something with p,q,r,s,t,u,v
" parentscript.py"
func_parentscript(field,queue):
c1=Process(target=func_child1())
c2=Process(target=func_child2())
c3=Process(target=func_child3())
c4=Process(target=func_child4())
c5=Process(target=func_child5())
# Do something with c1,c2,c3,c4,c5 as C
queue.put(C)
每个被调用的子函数都使用ES客户端并将输出发送回父脚本。