Не изменяется глобальная переменная при использовании Pool (python)
В массив count не добавляется переменная x, понятия не имею что сделать. При использовании Process тоже не добавлялось (Потоки не использовал ввиду существования GIL)
import time
from multiprocessing import Pool
count = []
def check(c):
ans = 0
for ch in str(c):
ans += int(ch)
return ans % 2
def dsa(x):
count = 0
for c in range(0,(len(x))):
if x[c] != 0:
count+=1
return count
def thread(star,end):
global count
x = dsa([check(x) for x in range(star, end+1)])
print(x)
count.append(x)
if __name__ == '__main__':
A = 1
B = 10000
time1 = time.time()
pool = Pool(processes=2)
start = time.time()
r1 = pool.apply_async(thread, (A, B//2))
r2 = pool.apply_async(thread, (B//2+1, B))
pool.close()
pool.join()
print(sum(count))
print(time.time()-time1))
Ответы (1 шт):
Автор решения: eri
→ Ссылка
Процессы в питон не имеют общей памяти. Для обмена данными лучше пользоваться очередями.
Если надо раздать массив без очередей
from multiprocessing import Array
count = Array('i', [])
..
count.append(x)
'i' - указывает тип содержимого массива.
В вашем случае map лучше:
def thread(star,end):
global count
x = dsa([check(x) for x in range(star, end+1)])
print(x)
return x
count = pool.map(thread, [(A, B//2),(B//2+1, B)])