我从文件列表和包含命令的字典开始。
现在我有了一个辅助函数,该函数将一批文件作为列表作为第一个参数,将字典作为第二个参数,并返回一个新的字典。
我真的不知道如何使它现在可以在多处理中以一种方式工作,即工作程序函数并行运行x次,其中x是PC的CPU计数,并且如果完成,则立即启动新进程。文件列表已经不是“空”了。
commandsdict也需要输入批号,还是我应该将其作为第三个arg传递?
尽管在过程返回时能够用它做些事会很好,但是最后将所有字典(在一个列表中?)全部收起来是没有问题的。
它是用于Linux的,运行的Python 3.5是我在Process Class上尝试过的,但未能使其正常工作,(我对编程还是很陌生,所以我可能看不到简单的解决方案:D),并且对于池类,我不知道如何通过突变的批号传递dict。
fileslist[1,2,3,4,5,6,7,8,9]
batchsize = 3
commanddict = {"BatchNumberStr": {"job{:05d}/".format(batchnumber): str}, {"command1": {value, type(value)}, etc}
(工作人员使用此批号创建一个文件夹,依此类推) 稍后,我会额外存储安全检查值的类型,我知道这可能不是最好的方法,但现在对我有用:D
现在我想像这样的CPU拥有尽可能多的工人
numjobs = len(fileslist) / batchsize
if int(numjobs) != numjobs:
numjobs = int(numjobs) +1
else:
numjobs = int(numjobs)
for i in range(numjobs):
use = []
for i in range(batchsize):
try:
use.append(fileslist.pop(0))
except IndexError:
break
commanddict.update({"BatchNumberStr": {"job{:05d}/".format(i): str}}
process = worker(deepcopy(use), deepcopy(commanddict))
process.start()
result = process.get()
process.join()
这只是从头开始 如何限制流程并在完成后加入新闻?如果有人可以帮助我做到这一点,如果游泳池更好,我将非常感激:)
更新: 我的解决方案现在是:
def poolfeeder(allfileslist, workdict):
a = 0
numfiles = (list(x for x in workdict["NumberofFilesPerBatch"]))[0]
status = True
while status is True:
filestouse = []
for x in range(numfiles):
try:
filestouse.append(allfileslist.pop(0))
except IndexError:
status = False
break
a = a + 1
workdict.update({"BatchNumberStr": {"job{:05d}/".format(a): str}})
if len(filestouse) > 0:
yield [deepcopy(filestouse), deepcopy(workdict)]
else:
return
def worker(listinput):
filelist = listinput[0]
commanddict = listinput[1]
do stuff
return result
poolfeed = poolfeeder(allfileslist, dict)
with mp.Pool(processes=numcpus) as p:
reslist = [p.apply_async(worker, (r,)) for r in poolfeed]
for result in reslist:
print(result.get())
这是个好方法吗?
如果一个工作进程遇到RunTimeError,是否将其保存为结果或使所有进程中断?如果不是,如果其中一个工作进程遇到RunTimeError,如何提高SystemExit?