在并发使用时此功能不起作用

时间:2019-11-07 20:59:10

标签: python multiprocessing concurrent.futures

我正在使用concurrent.futures.ProcessPoolExecutor()构建一组数组以使其更快。但是由于某种原因,该功能在de ProcessPoolExecutor()内部无法正常工作。

我的代码如下:

def bitflip(int,p):
    mask = 1 << p
    return (int^ mask)

def check(num, n):
    return (num>>n)&1


def func(h):
    l = 20
    j = 1
    delt = -1

    A = np.zeros((2**8,2**8))
    i = 2**12
    for x in range(0,2**l):
        for y in range(0,l):
            k = (y+1)%l
            print(x//i,x,y)
            if check(x,y) == 0:
                A[x//i,x//i] += -j*h/2
            else:
                A[x//i,x//i] += j*h/2
            if check(x,y) == check(x,k):
                A[x//i,x//i] += -(j*delt)/2
            else:
                A[x//i,x//i] += (j*delt)/2
                b = bitflip(x,y)
                c = bitflip(b,k)
                A[x//i,c//i] += -j
    print(A)

t1 = time.perf_counter()
list_t = [16,13,12]
with concurrent.futures.ProcessPoolExecutor() as executor:
    executor.map(func,list_t)


t2 = time.perf_counter()

print(f'Finished in {t2-t1} seconds')

输出就像只在第一个循环中输入一次:

0 0 0
0 0 1
0 0 2
0 0 3
0 0 4
0 0 5
0 0 6
0 0 7
0 0 8
0 0 9
0 0 10
0 0 11
0 0 12
0 0 13
0 0 14
0 0 15
0 0 16
0 0 17
0 0 18
0 0 19
0 1 0
Finished in 0.21422048099339008 seconds

但是如果我注释该部分给数组A的赋值,它将打印出完整的循环

1 个答案:

答案 0 :(得分:0)

删除print(x//i,x,y),它将向您的控制台发送2 ** 21日志的垃圾邮件,并尝试先以l=4之类的2的小幂循环。当我尝试使用较小的l变量并使用if __name__ == '__main__':时,它可以正常工作。 当您使用l=20运行它时,它也可以正常工作,但是计算时间很长。

import time
import numpy as np
from concurrent import futures
def bitflip(int,p):
    mask = 1 << p
    return (int^ mask)

def check(num, n):
    return (num>>n)&1

def func(h):
    l = 20
    j = 1
    delt = -1

    A = np.zeros((2**8,2**8))
    i = 2**12
    for x in range(0,2**l):
        for y in range(0,l):
            k = (y+1)%l
            # print(x//i,x,y)
            if check(x,y) == 0:
                A[x//i,x//i] += -j*h/2
            else:
                A[x//i,x//i] += j*h/2
            if check(x,y) == check(x,k):
                A[x//i,x//i] += -(j*delt)/2
            else:
                A[x//i,x//i] += (j*delt)/2
                b = bitflip(x,y)
                c = bitflip(b,k)
                A[x//i,c//i] += -j
    print(A)

if __name__ == '__main__':
    t1 = time.perf_counter()
    list_t = [16,13,12]
    with futures.ProcessPoolExecutor() as executor:
        executor.map(func,list_t)
    t2 = time.perf_counter()
    print(f'Finished in {t2-t1} seconds')