Trying to copy back elements in Array works with integers but not with strings in Multiprocessing Python module

Multi tool use
Multi tool use


Trying to copy back elements in Array works with integers but not with strings in Multiprocessing Python module



I am trying to write a process which does some computation on an Array filled with strings using the multiprocessing module. However, I am not able to get back the results. This is just a minimalist code example:


from multiprocessing import Process, Value, Array
from ctypes import c_char_p

# Process
def f(n, a):
for i in range(0,10):

a[i] = "test2".encode('latin-1')

if __name__ == '__main__':

# Set up array
arr = Array(c_char_p, range(10))

# Fill it with values
for i in range(0,10):
arr[i] = "test".encode('latin-1')



x =

for i in range(0,10):
num = Value('d', float(i)*F)
p = Process(target=f, args=(num, arr,))
x.append(p)
p.start()


for p in x:
p.join()

# THis works
print(num.value)

# This will not give out anything
print(arr[0])



The last line won't print out anything, despite it being filled or altered.



The main thing that concerns me, is when changing the code to just simply using integers it will work:


from multiprocessing import Process, Value, Array
from ctypes import c_char_p

def f(n, a):

for i in range(0,10):

a[i] = 5
if __name__ == '__main__':



arr = Array('i',range(10))
for i in tqdm(range(0,10)):
arr[i] = 10



x =

for i in range(0,10):
num = Value('d', float(i)*F)
p = Process(target=f, args=(num, arr,))
x.append(p)
p.start()


for p in x:
p.join()

print(num.value)
print(arr[0])



My Best guess is that this has something to do with the fact that the string array is acutally filled with char arrays and an integer is just one value, but I do not know how to fix this




1 Answer
1



This might answer your question, Basically the string array arr has an array of character pointers c_char_p, When the first process invokes the function f the character pointers are created in the context of itself but not in the other processes context, so eventually when the other processes tries to access the arr it will be invalid addresses.


arr


c_char_p


f


arr



In my case this seems to be working fine,


from multiprocessing import Process, Value, Array
from ctypes import c_char_p
values = ['test2438']*10

# Process
def f(n, a):
for i,s in enumerate(values):
a[i] = s

if __name__ == '__main__':

# Set up array
arr = Array(c_char_p, 10)
for i in range(0,10):
arr[i] = 'test'
# Fill it with values
x =

for i in range(0,10):
num = Value('d', float(i))
p = Process(target=f, args=(num, arr,))
x.append(p)
p.start()

for p in x:
p.join()

# This will not give out anything
print(arr[:])






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

bTy8SoCvw2Mj2 tyH3YI1KPD 0Wc0 8nTOsuqPv8,XA4z,axthie5Am F Gjw4QdsHa3 MN
bv2aS3F

Popular posts from this blog

Rothschild family

Cinema of Italy