Общий указатель не будет работать в другом процессе, поскольку указатель действителен только в том процессе, в котором он был создан.Вместо этого используйте массив:
import multiprocessing as mp
def test(x):
x.value = b'Test worked!'
if __name__ == "__main__":
x = mp.Array('c',15)
p = mp.Process(target=test, args = (x,))
p.start()
p.join()
print(x.value)
Вывод:
b'Test worked!'
Обратите внимание, что тип массива 'c'
является специализированным и возвращает SynchronizedString
против других типов, которые возвращают SynchronizedArray
,Вот как использовать тип 'u'
, например:
import multiprocessing as mp
from ctypes import *
def test(x):
x.get_obj().value = 'Test worked!'
if __name__ == "__main__":
x = mp.Array('u',15)
p = mp.Process(target=test, args = (x,))
p.start()
p.join()
print(x.get_obj().value)
Выходные данные:
Test worked!
Обратите внимание, что операции с заключенными в нем значениями, не являющимися атомами, такими как +=
, выполняютчтение / изменение / запись должны быть защищены с помощью диспетчера контекста with x.get_lock():
.