windows - 为什么我的 Python 多处理工作进程不使用多核?

标签 windows python-3.x multiprocessing

使用多处理中的 Pool 类,我将数据库搜索任务拆分为并行进程,每个进程针对我已加载到内存中的超大数据库运行一组正则表达式。 该程序在具有 60 多个内核和大量内存的强大的 Windows 服务器上运行。

我的 Python 编程经验,尤其是多处理,非常肤浅。

当我第一次创建程序时,一切正常,每个 worker 都很好地处理了自己的部分并继续下一个。我有好几个月没有碰它,直到我不得不对数据库查询进行一些格式更改,但是当我再次启动它时,它运行得太慢了。 在测试中,我确定我生成的进程数量实际上并没有改变运行速度,事实上,查看任务管理器显示所有进程都在那里冷却,但实际上只有一个进程显示出任何工作迹象。

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 设置可能已被更改以取消我的员工使用单独内核的资格?

最佳答案

在我看来,代码 (p.apply_async(calc, (rules, record))).get() 会强制您的程序一次只运行一个作业。父进程将在 get() 中等待上一个作业的结果可用,然后再启动下一个作业。

尝试用一次调用 starmap 来替换 Records 和多次 apply_async 调用的循环:

Hits = p.starmap(calc, ((rules, record) for record in Records))

这会将记录传递到池中,并且只有在它们全部发送后才会阻止结果出现。

关于windows - 为什么我的 Python 多处理工作进程不使用多核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23961303/

相关文章:

windows - 在 Windows 8 应用程序模式而非桌面模式下打开 IE URL

c++ - 在 C++ 中读取所有文件被 .文件夹

c++ - 更改另一个应用程序的速度

python - 类型错误 : worker() takes 0 positional arguments but 1 was given

python - 检查 Linux 系统上 python 多处理中的 fork 行为

python - 更新来自不同进程的相同实例变量

node.js - 如何在 Windows 和 Ubuntu 上将 node.js 从 0.12 版本升级到 4.0 版本

python - 最接近 python 中的虚拟调用

python - 在python中添加范围

python - 远程队列消费者在重启后错过了第一条消息