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, который не является многопроцессорным.Значение , так что это не проблема только со значениями многопроцессорности. Единственное, что я не проверял явно, — это отсутствие какого-либо состояния гонки между моментом создания этого объекта и вызовом функции запуска, но я не могу себе представить, что это так. По сути, я обнаружил, что переменные, хранящиеся в объекте в родительском процессе, не передаются его аналогу в дочернем процессе, если только я не пропустил что-то еще, что очень очевидно, но я не могу найти больше ничего об этом в Интернете.< /п>
У меня есть класс multiprocessing.Process, который я создал для эмуляции реального устройства, вот так: [code]class EmulatorViron(multiprocessing.Process): BIND_PORT_RANGE = [30800, 30900] socket = None bind_port: int client = None DEFAULT_PASSWORD = ""
# 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() [/code] Я пытаюсь установить пароль «helloworld» через kwargs, и это работает, но когда я действительно запускаю процесс, он, кажется, инициализируется повторно, и он возвращается к пустой строке. Я заметил, что то же самое происходит и с другими переменными, например,bind_port, который не является многопроцессорным.Значение , так что это не проблема только со значениями многопроцессорности. Единственное, что я не проверял явно, — это отсутствие какого-либо состояния гонки между моментом создания этого объекта и вызовом функции запуска, но я не могу себе представить, что это так. По сути, я обнаружил, что переменные, хранящиеся в объекте в родительском процессе, не передаются его аналогу в дочернем процессе, если только я не пропустил что-то еще, что очень очевидно, но я не могу найти больше ничего об этом в Интернете.< /п>