#python #python-multiprocessing
Вопрос:
main_script.py
import multiprocessing
import ctypes
from os import getpid
from slave_script import monitor
communication_line = multiprocessing.Array(ctypes.c_char, b"0")
m = multiprocessing.Process(target=monitor, args=(communication_line))
m.start()
m.join()
slave_script.py
from time import sleep
def monitor(communication_line):
while 1:
print(type(communication_line))
sleep(2)
бег main_script.py продолжает возвращать <байты класса’><байты класса’> со значением b»0″.
НО при передаче других фиктивных данных в качестве аргумента подчиненный получает их как объект.
Итак, модифицируя main_script.py строка №8 для:
m = multiprocessing.Process(target=monitor, args=(communication_line, 6969))
И изменение slave_script.py строка №3 для:
def monitor(communication_line, dummy_data_to_ignore):
продолжает возвращаться (то, чего я пытаюсь достичь) СинхронизироВанная строка’>>
Итак, я в замешательстве, почему он не видел communication_line как объект, пока я не отправил вместе с ним другие данные?
Комментарии:
1.
args
В вашем первом примере отсутствует запятая, вы передаете массив как аргументы, а не кортеж, в котором массив является единственным аргументом:args=(communication_line, )
2. @IainShelvington О, действительно, это сработало только с запятой. Но не могли бы вы уточнить, зачем нужна связь? Разве он не отправляется также в виде кортежа без запятой?
3. Запятая-это то, что обозначает кортеж, а не скобки
Ответ №1:
args
Параметр должен быть кортежем. (communication_line)
это не кортеж. Запятая образует кортеж. Скобки необходимы только для порядка операций. Рассмотрим 1
, (1)
, ((1))
все целое число равно единице. Но 1,
, (1,)
и ((1,))
все кортежи. Воспользуйся args = (communication_line,)
.
Или другой пример:
>>> x=1,
>>> type(x)
<class 'tuple'>
>>> x=(1)
>>> type(x)
<class 'int'>