Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 为什么不';我的Python多处理工作进程是否使用多核?_Windows_Python 3.x_Multiprocessing - Fatal编程技术网

Windows 为什么不';我的Python多处理工作进程是否使用多核?

Windows 为什么不';我的Python多处理工作进程是否使用多核?,windows,python-3.x,multiprocessing,Windows,Python 3.x,Multiprocessing,使用multiprocessing中的Pool类,我将一个数据库搜索任务拆分为并行进程,每个进程针对我加载到内存中的一个非常大的数据库运行一组正则表达式。 该程序运行在一个非常坚固的Windows服务器上,有60多个内核和大量内存 我的Python编程经验,尤其是多处理经验,相当肤浅 当我第一次创建程序时,一切都很好,每个工人都很好地处理了自己的工作,然后继续下一个工作。我有几个月没有碰它,直到我不得不对数据库查询进行一些格式更改,但是当我再次启动它时,它运行得太慢了。 在测试中,我确定生成的进

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

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

在我看来,代码似乎是
(p.apply\u async(calc,(rules,record))。get()
强制程序一次只运行一个作业。父进程将在
get()
中等待上一个作业的结果变为可用,然后再启动下一个作业

尝试将循环覆盖
记录
和多个
应用异步
调用替换为一个对
星图
的调用:

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

这将把一部分记录传递到池中,并且只有在它们都被发送后才能阻止结果的出现。

要充实@blckknght的答案:
apply\u async()
提交一个作业,但是
.get()
要求立即得到结果。一个更简单的解决方案是提交所有作业,然后在它们进入时接受每个结果,而不考虑顺序。即使用

来源 输出
我将其交换到循环中,回溯告诉我现在有一个“IndexError:list index out-range”(索引器:列表索引超出范围)。我对代码进行了一些修改,希望问题只是“rules”(规则)值本身就是一个列表,但此时我无法消除输入规则列表的需要。与此同时,我正在研究其他一些方法。好的,我解决了这个问题。事实证明,没有一个map函数可以处理第二个变量,该变量与迭代函数一起作为函数的输入。在我的例子中,
rules
本身就是一个列表列表,而map(map、starmap或imap是相同的)不知道如何在
Records
中的
record
迭代过程中将其交给
calc
。我找到了一种将
规则
嵌入
calc
定义中的方法,现在程序正在以适当的速度运行!使用imap_unordered功能如广告所示,谢谢!
import multiprocessing

def calc(num):
    return num*2

pool = multiprocessing.Pool(5)
for output in pool.imap_unordered(calc, [1,2,3]):
    print 'output:',output
output: 2
output: 4
output: 6