【发布时间】:2014-07-20 14:37:33
【问题描述】:
使用多处理中的 Pool 类,我将数据库搜索任务拆分为并行进程,每个进程针对我已加载到内存中的非常大的数据库运行一组正则表达式。 该程序在具有 60 多个内核和大量内存的强大 Windows 服务器上运行。
我的 Python 编程经验,尤其是多处理,是相当肤浅的。
当我第一次创建程序时,一切正常,每个工人都很好地处理了它的部分,然后继续处理下一个。我有几个月没有碰它,直到我不得不对数据库查询进行一些格式更改,但是当我再次启动它时,它运行得太慢了。 在测试中,我确定我生成的进程数量实际上并没有改变运行速度,并且确实查看任务管理器显示所有进程都在那里冷却,但其中只有一个实际上显示出任何工作迹象。
def calc(ruleList,record):
returnList = []
print(record[5],end = '\r')
hits = recordIterator(ruleList,record)
for h in hits:
returnList.append([record[0],record[1],h])
return returnList
nthreads = 48
hname = 'Hits.txt'
p = multiprocessing.Pool(processes = nthreads)
Hits = []
for record in Records:
Hits.append((p.apply_async(calc, (rules, record))).get())
hhandle = open(hname, "w")
for hit in Hits:
try:
for x in hit:
hhandle.write(str(x[0])+'|'+str(x[1])+'|'+str(x[2])+'\n')
except (UnicodeEncodeError,UnicodeDecodeError):
pass
hhandle.close()
我不是机器上的管理员,也不熟悉如何配置服务器,但在我看来,Windows 根本没有将子进程调度到单独的内核。 我尝试以多种不同的方式重新配置我的代码以避免潜在的多处理阻塞,但每个功能变体最终都会遇到同样的问题。
我的代码中是否有一些我遗漏的东西阻碍了流程? 是否有某些 Windows Server 设置可能已更改,以使我的工作人员无法使用单独的内核?
【问题讨论】:
标签: windows python-3.x multiprocessing