since multiprocessing need to be put inside __main__
in windows, i found out that my global variable is not passed to my function.
from multiprocessing import Pool, Value
def Proses(lines):
global xyz
try:
print(lines)
print(xyz)
except Exception as e:
print(e)
def counter_handler(args):
global counter
counter = args
def Dosomething():
a = [i for i in range(10)]
return a
if __name__ == '__main__':
# i want to share xyz variable
xyz = Dosomething()
threads = []
data = ["bjir", "bjir", "bjir"]
counter = Value('i', 0)
with Pool(1) as pool:
p = Pool(1, initializer=counter_handler, initargs=(counter,))
i = p.map_async(Proses, data, chunksize=1)
i.wait()
been searching for hours but still no clue and i think maybe this is a duplcate quetions and i know it but i still can't find any answers. Is there any way to pass my xyz
variable to my function?
As you have written in your example, Pool
has initializer=
and initargs=
parameters which you can use to initialize the global variables as well:
from multiprocessing import Pool, Value
def Proses(lines):
global xyz
print(lines)
print(xyz)
def Dosomething():
a = [i for i in range(10)]
return a
def init_pool(a, cnt):
global xyz, counter
xyz = a
counter = cnt
if __name__ == "__main__":
# i want to share xyz variable
xyz = Dosomething()
data = ["bjir", "bjir", "bjir"]
counter = Value("i", 0)
with Pool(1, initializer=init_pool, initargs=(xyz, counter)) as pool:
i = pool.map_async(Proses, data, chunksize=1)
i.wait()
Prints:
bjir
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
bjir
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
bjir
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]