动态计算要生成的进程数量
我有一个包含大约15年的列表,叫做year_queue,我需要为每一年启动一个进程。但根据我运行代码的服务器不同,处理器的数量也会不同。我该如何根据服务器上的处理器数量动态调整变量num_processes呢?
如果我把num_processes设置得比处理器数量还多,会不会自动按这个数量启动进程?我测试了一下,结果是创建了15个进程,并且把CPU的能力分配给它们。我想找一种方法,先创建'n'个进程,其中n等于服务器上的处理器数量,然后等这些进程完成后,再启动下一个进程。
for i in range(num_processes):
worker = ForEachPerson(year_queue, result_queue, i, dict_of_files)
print "worker spawned for " + str(i)
worker.start()
results = []
while len(results) < len(years):
result = result_queue.get()
results.append(result)
有没有人遇到过同样的问题?
while year_queue.empty() != True:
for i in range(num_processes):
worker = ForEachPerson(year_queue, result_queue, i, dict_of_files)
print "worker spawned for " + str(i)
worker.start()
# collect results off the queue
print "results being collected"
results = []
while len(results) < len(num_processes):
result = result_queue.get()
results.append(result)
2 个回答
0
from multiprocessing import Process, Queue, cpu_count
from Queue import Empty
class ForEachPerson(Process):
def __init__(self, year_queue, result_queue, i, dict_of_files):
self.year_queue=year_queue
self.result_queue=result_queue
self.i=i
self.dict_of_files=dict_of_files
super(ForEachPerson, self).__init__()
def run(self):
while True:
try:
year=self.year_queue.get()
''' Do something '''
self.result_queue.put(year)
except Empty:
self.result_queue.close()
return
if __name__ == '__main__':
year_queue=Queue()
result_queue=Queue()
dict_of_files={}
start_year=1996
num_years=15
for year in range(start_year, start_year + num_years):
year_queue.put(year)
workers=[]
for i in range(cpu_count()):
worker = ForEachPerson(year_queue, result_queue, i, dict_of_files)
print 'worker spawned for', str(i)
worker.start()
workers.append(worker)
results=[]
while len(results) < num_years:
try:
year=result_queue.get()
results.append(year)
print 'Result:', year
except Empty:
pass
for worker in workers:
worker.terminate()
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。
4
使用一个 多进程池。这个类会帮你处理很多繁琐的事情,比如选择合适的进程数量并为你运行它们。而且,它不会为每个任务都新建一个进程,而是会在一个进程完成后重复使用它。
def process_year(year):
...
return result
pool = multiprocessing.Pool()
results = pool.map(process_year, year_queue)