Многопроцессорность Python: multiprocessing. Значение возвращается к значению по умолчанию после запуска процессаPython

Программы на Python
Ответить
Anonymous
 Многопроцессорность Python: multiprocessing. Значение возвращается к значению по умолчанию после запуска процесса

Сообщение Anonymous »

У меня есть класс multiprocessing.Process, который я создал для эмуляции реального устройства, вот так:

Код: Выделить всё

class EmulatorViron(multiprocessing.Process):
BIND_PORT_RANGE = [30800, 30900]
socket = None
bind_port: int
client = None
DEFAULT_PASSWORD = ""

COOLING_TEMP_MIN = 15.0
COOLING_TEMP_MAX = 90.0

HEATING_COEF = 2.5  # roughly degrees / sec
COOLING_COEF = 2.0  # roughly degrees / sec

def __init__(self, **kwargs):
super().__init__()
logger.info(f"Received kwargs: {kwargs}")
# update the DEFAULT_SETTINGS with the init arguments
self.bind_port = int(kwargs["bind_port"]) if "bind_port" in kwargs else None  # used in ETH emulator
self.socket = None
# Initialize version
self.device_identifier = kwargs.get("device_identifier", "VIRON")
self.laser_password = multiprocessing.Value(
c_wchar_p, kwargs.get("laser_password", self.DEFAULT_PASSWORD)  # Default password is always valid!
)
logger.info(f"Current password: {self.laser_password.value}")
self.operation_delay = kwargs.get("operation_delay", 1)
self.delay_between_commands = kwargs.get("delay_between_commands", 0.1)

# initialize rest of the state
self.user_authenticated = multiprocessing.Value(c_bool, kwargs.get("user_authenticated", False))
self.fire_mode = multiprocessing.Value(c_bool, kwargs.get("fire_mode", False))
self.standby_mode = multiprocessing.Value(c_bool, kwargs.get("standby_mode", False))
self.is_flashing = multiprocessing.Value(c_bool, kwargs.get("is_flashing", False))
self.is_switching = multiprocessing.Value(c_bool, kwargs.get("is_switching", False))
self.user_shots = multiprocessing.Value("i", kwargs.get("user_shots", 8001))
self.fl_mode_int = multiprocessing.Value(c_bool, kwargs.get("fl_mode", True))  # True: Internal, False: External
self.qs_mode_int = multiprocessing.Value(c_bool, kwargs.get("qs_mode", True))  # True: Internal, False: External
self.qs_delay = multiprocessing.Value("i", kwargs.get("qs_delay", 50))
self.cooling_temp = multiprocessing.Value("f", kwargs.get("t_cool", self.COOLING_TEMP_MIN))

# Inititalize status flag
self.bnc_interlock = multiprocessing.Value(c_bool, kwargs.get("bnc_interlock", False))  # generic for all lasers

# Initialize port
self.client_port_name = ""
self._initialize_connection()
self._running_flag = multiprocessing.Event()
Я пытаюсь установить пароль «helloworld» через kwargs, и это работает, но когда я действительно запускаю процесс, он, кажется, инициализируется повторно, и он возвращается к пустой строке.
Я заметил, что то же самое происходит и с другими переменными, например,bind_port, который не является многопроцессорным.Значение , так что это не проблема только со значениями многопроцессорности. Единственное, что я не проверял явно, — это отсутствие какого-либо состояния гонки между моментом создания этого объекта и вызовом функции запуска, но я не могу себе представить, что это так. По сути, я обнаружил, что переменные, хранящиеся в объекте в родительском процессе, не передаются его аналогу в дочернем процессе, если только я не пропустил что-то еще, что очень очевидно, но я не могу найти больше ничего об этом в Интернете.< /п>

Подробнее здесь: https://stackoverflow.com/questions/791 ... ue-after-p
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»