我有一个Python脚本,我想用作另一个Python脚本的控制器.我有一个64位处理器的服务器,所以想要产生第二个Python脚本的64个子进程.子脚本被调用:
$ python create_graphs.py --name=NAME
Run Code Online (Sandbox Code Playgroud)
其中NAME是XYZ,ABC,NYU等.
在我的父控制器脚本中,我从列表中检索名称变量:
my_list = [ 'XYZ', 'ABC', 'NYU' ]
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,作为孩子产生这些过程的最佳方法是什么?我想一次将子项数限制为64,因此需要跟踪状态(如果子进程已完成或未完成),这样我就可以有效地保持整个代的运行.
我查看了使用子进程包,但拒绝它,因为它一次只生成一个子进程.我终于找到了多处理器包,但我承认被整个线程与子进程文档所淹没.
现在,我的脚本subprocess.call一次只生成一个孩子,看起来像这样:
#!/path/to/python
import subprocess, multiprocessing, Queue
from multiprocessing import Process
my_list = [ 'XYZ', 'ABC', 'NYU' ]
if __name__ == '__main__':
processors = multiprocessing.cpu_count()
for i in range(len(my_list)):
if( i < processors ):
cmd = ["python", "/path/to/create_graphs.py", "--name="+ my_list[i]]
child = subprocess.call( cmd, shell=False )
Run Code Online (Sandbox Code Playgroud)
我真的希望它一次产生64个孩子.在其他stackoverflow问题中,我看到人们使用Queue,但似乎这会产生性能损失?
什么是在python 2.7中进行并行处理的简单代码?我在网上找到的所有例子都很复杂,包括不必要的代码.
我怎么做一个简单的强力整数分解程序,我可以在每个核心(4)上计算1个整数?我的真实程序可能只需要2个核心,并且需要共享信息.
我知道parallel-python和其他库存在,但我想将库的数量保持在最低限度,因此我想使用thread和/或multiprocessing库,因为它们带有python
如何使用线程和子进程模块生成并行bash进程?当我启动线程时,第一个答案就在这里:如何在Python中使用线程?,bash进程按顺序而不是并行运行.
我正在使用一组我希望并行运行的作业填充队列,并使用python的多处理模块来执行此操作.以下代码段:
import multiprocessing
from multiprocessing import Queue
queue = Queue()
jobs = [['a', 'b'], ['c', 'd']]
for job in jobs:
queue.put(job)
Run Code Online (Sandbox Code Playgroud)
当我做queue.get()时,我得到以下内容:
['a', 'b']
Run Code Online (Sandbox Code Playgroud)
为什么队列中没有填充所有作业?
我正在尝试在python 2.6中使用多处理模块,但显然有些东西我不明白.我希望下面的类能够添加add()发送给它的数字,并在get_result()方法中返回总和.下面的代码打印"0",我希望它打印"2".我错过了什么?
import multiprocessing
class AdderProcess(multiprocessing.Process):
def __init__(self):
multiprocessing.Process.__init__(self)
self.sum = 0
self.queue = multiprocessing.JoinableQueue(5)
self.daemon = True
self.start()
def run(self):
while True:
number = self.queue.get()
self.sum += number
self.queue.task_done()
def add(self, number):
self.queue.put(number)
def get_result(self):
self.queue.join()
return self.sum
p = AdderProcess()
p.add(1)
p.add(1)
print p.get_result()
Run Code Online (Sandbox Code Playgroud)
PS.这个问题已经解决了.谢谢你的回答!只是为了让任何读者更容易,这是完整的工作版本:
import multiprocessing
class AdderProcess(multiprocessing.Process):
def __init__(self):
multiprocessing.Process.__init__(self)
self.sum = multiprocessing.Value('d', 0.0)
self.queue = multiprocessing.JoinableQueue(5)
self.daemon = True
self.start()
def run(self):
while True:
number = self.queue.get()
self.sum.value += number
self.queue.task_done()
def add(self, number): …Run Code Online (Sandbox Code Playgroud)