Многопроцессорное значение() ctypes.c_wchar_p приводит к зависанию потока, альтернатива?Python

Программы на Python
Ответить
Anonymous
 Многопроцессорное значение() ctypes.c_wchar_p приводит к зависанию потока, альтернатива?

Сообщение Anonymous »

Я выполняю параллелизм, используя Multiprocessing() и Threading(). Идея состоит в том, чтобы создать несколько потоков из нескольких процессов. Потокам необходим доступ к глобальной переменной, которая использует Value(), чтобы переменную можно было изменить и распределить по процессу (и, как я полагаю, по потокам). Итак, структура:

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

from multiprocessing import Queue, Process, Value
dc = {A: Queue(cpu_count), B: Value(ctypes.c_wchar_p, '', lock = False), C: Value('i', 0, lock = False)}
Process1 as supplement process that spawns worker threads:
Threads1 as task_producer for Queue
Threads2 giving flag signal for KeyboardInterrupt dc[c].value
Process3-8 as main process that spawns multiple threads:
Threads1-4 from Process3-8 access dc[b].value to connect
Но после доступа потоки зависали при загрузке значения dc.value. Но при печати dc он работает и упоминает о существовании Value():

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

c_wchar_p(2184070568752)
Ради теста я создал несколько минимальных воспроизводимых примеров:

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

from multiprocessing import Process, Queue, Manager, cpu_count, Value, Lock
import threading
import ctypes
import time

def print_props():
while True:
print('Process1 ', props['A'].value)

def change_props():
while True:
if props['A'].value == '0':
props['A'].value = '1'
else:
props['A'].value = '0'
print('Process2 ', props['A'].value)

def props_thread(n):
global props
props = n
task_producer_thread = threading.Thread(target = change_props)
task_producer_thread.start()
task_producer_thread.join()

def main_thread(n):
global props
props = n
task_producer_thread = threading.Thread(target = print_props)
task_producer_thread.start()
task_producer_thread.join()

def main():
parent_process = []
props_thread_process = Process(target = main_thread, args = (props, ))
props_thread_process.start()
parent_process.append(props_thread_process)

main_thread_process = Process(target = props_thread, args = (props, ))
main_thread_process.start()
parent_process.append(main_thread_process)

for i in parent_process:
i.join()

if __name__ == '__main__':
global props
props = {"A": Value(ctypes.c_wchar_p, '0', lock = False), "B": Value('i', 0, lock = False)}
main()
Похоже, что Value(ctypes.c_wchar_p, '', lock = False) не может быть доступен одновременно через потоки и процесс, но с использованием Value('i', 0, lock = False), что соответствует c_ulong(0), работает нормально, без зависаний.
Я ожидаю, что Threading() внутри Multiprocessing() также может обращаться к Value(). Итак, при вызове dc.value он возвращает строку домена. Есть ли способ распределить редактируемую строку глобальной переменной между многопроцессорными процессорами и потоками?
Запуск последней версии python3.12
в Windows 11 22H2

Подробнее здесь: https://stackoverflow.com/questions/792 ... lternative
Ответить

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

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

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

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

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