Многопроцессорная обработка отправляет значение объекта вместо объекта в качестве аргумента при передаче в одиночку

#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'>