Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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
Python 在多进程循环中访问全局变量_Python_Windows_Loops_Multiprocessing - Fatal编程技术网

Python 在多进程循环中访问全局变量

Python 在多进程循环中访问全局变量,python,windows,loops,multiprocessing,Python,Windows,Loops,Multiprocessing,我不知道发生了什么?!这很奇怪,你能解释一下原因并修复它吗? 我试图在2个循环中运行多处理,为了减少计算量,我需要计算一些全局变量,即'ga'和'gb',但在进入多处理的函数'sirgr'中,ga和gb会扭曲。ga到(循环1的最后一个范围减去1加100,我的意思是107)和gb(循环2的最后一个范围减去1加100,我的意思是123),那么发生了什么?全局ga,gb也没有任何帮助。 我知道ofc,我可以将其发送到函数,但我需要全局 import multiprocessing def sirgr(

我不知道发生了什么?!这很奇怪,你能解释一下原因并修复它吗? 我试图在2个循环中运行多处理,为了减少计算量,我需要计算一些全局变量,即'ga'和'gb',但在进入多处理的函数'sirgr'中,ga和gb会扭曲。ga到(循环1的最后一个范围减去1加100,我的意思是107)和gb(循环2的最后一个范围减去1加100,我的意思是123),那么发生了什么?
全局ga,gb
也没有任何帮助。 我知道ofc,我可以将其发送到函数,但我需要全局

import multiprocessing
def sirgr(row,col):
    global ga,gb
    print('sirgr',ga,gb)
    return ((row,col),(ga,gb))
def main():
    print('mainf',ga,gb)
    if __name__=="__main__":
        with multiprocessing.Pool() as pool:
            print('ino',tupleinput)
            output = list(pool.starmap(sirgr,tupleinput))
            print('out',output)
process_num=2
tupleinput=[]
for row in range(8):
    ga=row+100
    for col in range(20,24):
        gb=col+100
        print("r",row,'c',col)
        print('mainit',ga,gb)
        tupleinput.append((row,col))
        if len(tupleinput)==process_num:
            main()
            tupleinput=[]

结果:

#############
r 0 c 20
mainit 100 120
r 0 c 21
mainit 100 121
mainf 100 121
ino [(0, 20), (0, 21)]
out [((0, 20), (107, 123)), ((0, 21), (107, 123))]
#############
r 0 c 22
mainit 100 122
r 0 c 23
mainit 100 123
mainf 100 123
ino [(0, 22), (0, 23)]
out [((0, 22), (107, 123)), ((0, 23), (107, 123))]
....
#############
r 7 c 20
mainit 107 120
r 7 c 21
mainit 107 121
mainf 107 121
ino [(7, 20), (7, 21)]
out [((7, 20), (107, 123)), ((7, 21), (107, 123))]
#############
r 7 c 22
mainit 107 122
r 7 c 23
mainit 107 123
mainf 107 123
ino [(7, 22), (7, 23)]
out [((7, 22), (107, 123)), ((7, 23), (107, 123))]

例如,在
r0c21之后的输出中

out[((0,20),(100121)),((0,21),(100121))]

但事实确实如此

out[({row},{col-1}),(107123)),(({row},{col}),(107123))]用于所有输出
但我应该是


out[({row},{col-1}),({row},{col+100})),({row},{col}),{col+100})]
您没有提供
q
函数,所以我创建了自己的函数

请参阅我的评论:无法修改主进程中的常规全局变量,并希望它们在子进程的addrss空间中显示为已更改。如果您坚持使用全局变量,则必须对这些变量进行管理和共享。必须通过其
属性访问其实际值

注意:您的代码一次只调用两个元组的
starmap
,这并不是最有效的处理方法,当然,除非您只有两个CPU内核,但即使这样,还是最好将所有任务排队并调用
starmap
一次,这样会减少空闲时间。由于您创建的池没有参数,因此它将创建一个池大小等于您拥有的CPU内核数,很可能大于两个。因此,您应该利用您拥有的任何CPU

导入多处理
def q(*args):
args=[str(arg)表示args中的arg]
打印(“,”.join(args))
def初始池(globala、globalb):
全球ga,gb
ga=globala
gb=全局B
def sirgr(世界其他地区,哥伦比亚):
q('sirgr',ga.value,gb.value)
返回((行,列),(ga.value,gb.value))
def干管(池、tupleinput):
q('main',总价值,gb.价值)
q('ino',tupleinput)
输出=pool.starmap(sirgr,tupleinput)
q(“输出”,输出)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
使用multiprocessing.Manager()作为管理器:
ga=管理器值('i',0)
gb=manager.Value('i',0)
pool=multiprocessing.pool(初始值设定项=init_pool,initargs=(ga,gb))
tupleinput=[]
对于范围(8)中的行:
ga.value=行+100
对于范围(20,24)内的列:
gb.value=col+100
q(“r”,行,“c”,列)
q('mainit',ga.value,gb.value)
tupleinput.append((行,列))
干管(池、tupleinput)
印刷品:

r, 0, c, 20
mainit, 100, 120
r, 0, c, 21
mainit, 100, 121
r, 0, c, 22
mainit, 100, 122
r, 0, c, 23
mainit, 100, 123
r, 1, c, 20
mainit, 101, 120
r, 1, c, 21
mainit, 101, 121
r, 1, c, 22
mainit, 101, 122
r, 1, c, 23
mainit, 101, 123
r, 2, c, 20
mainit, 102, 120
r, 2, c, 21
mainit, 102, 121
r, 2, c, 22
mainit, 102, 122
r, 2, c, 23
mainit, 102, 123
r, 3, c, 20
mainit, 103, 120
r, 3, c, 21
mainit, 103, 121
r, 3, c, 22
mainit, 103, 122
r, 3, c, 23
mainit, 103, 123
r, 4, c, 20
mainit, 104, 120
r, 4, c, 21
mainit, 104, 121
r, 4, c, 22
mainit, 104, 122
r, 4, c, 23
mainit, 104, 123
r, 5, c, 20
mainit, 105, 120
r, 5, c, 21
mainit, 105, 121
r, 5, c, 22
mainit, 105, 122
r, 5, c, 23
mainit, 105, 123
r, 6, c, 20
mainit, 106, 120
r, 6, c, 21
mainit, 106, 121
r, 6, c, 22
mainit, 106, 122
r, 6, c, 23
mainit, 106, 123
r, 7, c, 20
mainit, 107, 120
r, 7, c, 21
mainit, 107, 121
r, 7, c, 22
mainit, 107, 122
r, 7, c, 23
mainit, 107, 123
mainf, 107, 123
ino, [(0, 20), (0, 21), (0, 22), (0, 23), (1, 20), (1, 21), (1, 22), (1, 23), (2, 20), (2, 21), (2, 22), (2, 23), (3, 20), (3, 21), (3, 22), (3, 23), (4, 20), (4, 21), (4, 22), (4, 23), (5, 20), (5, 21), (5, 22), (5, 23), (6, 20), (6, 21), (6, 22), (6, 23), (7, 20), (7, 21), (7, 22), (7, 23)]
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
sirgr, 107, 123
out, [((0, 20), (107, 123)), ((0, 21), (107, 123)), ((0, 22), (107, 123)), ((0, 23), (107, 123)), ((1, 20), (107, 123)), ((1, 21), (107, 123)), ((1, 22), (107, 123)), ((1, 23), (107, 123)), ((2, 20), (107, 123)), ((2, 21), (107, 123)), ((2, 22), (107, 123)), ((2, 23), (107, 123)), ((3, 20), (107, 123)), ((3, 21), (107, 123)), ((3, 22), (107, 123)), ((3, 23), (107, 123)), ((4, 20), (107, 123)), ((4, 21), (107, 123)), ((4, 22), (107, 123)), ((4, 23), (107, 123)), ((5, 20), (107, 123)), ((5, 21), (107, 123)), ((5, 22), (107, 123)), ((5, 23), (107, 123)), ((6, 20), (107, 123)), ((6, 21), (107, 123)), ((6, 22), (107, 123)), ((6, 23), (107, 123)), ((7, 20), (107, 123)), ((7, 21), (107, 123)), ((7, 22), (107, 123)), ((7, 23), (107, 123))]
更新

如果确实希望一次提交两个任务,则(假设要提交的任务总数是2的倍数):

如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
使用multiprocessing.Manager()作为管理器:
ga=管理器值('i',0)
gb=manager.Value('i',0)
pool=multiprocessing.pool(2,初始值设定项=init_pool,initargs=(ga,gb))
tupleinput=[]
对于范围(8)中的行:
ga.value=行+100
对于范围(20,24)内的列:
gb.value=col+100
q(“r”,行,“c”,列)
q('mainit',ga.value,gb.value)
tupleinput.append((行,列))
如果len(tupleinput)==2:
干管(池、tupleinput)
tupleinput=[]
更新2

我只是碰巧重新访问了它,看到我正在为
ga
gb
使用托管
Value
实例,这两个实例都可以工作,但比共享内存
Value
实例的开销更大,对于这个问题,您只需要这些实例:

如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
ga=多处理。值('i',0,Lock=False)#不需要同步
gb=多处理。值('i',0,Lock=False)#不需要同步
pool=multiprocessing.pool(2,初始值设定项=init_pool,initargs=(ga,gb))
... # 等

是否有人运行此代码查看结果?似乎没有人在发布带有多处理标记的问题时遵循使用运行平台标记问题的指导原则。如果您在Windows上运行,您的'if\u name\uuuu==“\ u main\uuuuuuu”:`位于错误的位置。@Booboo那么我应该将其放置在哪里?if
len(tupleinput)==process\u num:if\u name\u==“\u main\u”:main()
??!关键是,在调用第一个辅助函数
sirgr
之前,池中的每个进程都将执行全局范围内的任何代码。这将是所有以
process_num=2
开始的代码,以及以下代码,包括范围(20,24)中列开始的
循环:
,在该循环中调用函数
q
。如果将
移动到“\uuuuu name\uuuu==”\uuuuu main\uuuu“:
以便所有这些代码都位于以此开头的块中,这有意义吗?顺便说一句,您正在循环中一次又一次地创建池。如果移动
If
语句,使我提到的所有代码都在其中,则应该创建一次池(不要将
一起使用,因为我们不希望隐式调用池上的
terminate
,除非嵌套的
for
循环位于
with
块内)在循环之前的块中,将池传递到
main
,这样就可以在不重新创建的情况下反复使用。非常感谢您,这些也不是我所写的,而是非常接近我想要的。我应该重读你说的话,也许以后再问问题。我会在以后给你最后的答案。又来了