我正在使用 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[b].value
时线程就会卡住。但是当打印 dc[b]
时,它起作用并提到 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)
,工作得很好,不会卡住。
我期望 Multiprocessing() 内的 Threading() 也可以访问从 Multiprocessing() 模块派生的 Value() 。因此,当调用 dc[b].value 时,它返回域字符串。有没有一种方法可以跨多处理和线程分发可编辑的全局变量字符串?
运行最新的python3.12 在 Windows 11 22H2 上
有没有办法跨多处理和线程分发可编辑的全局变量字符串?
您提供了一些有关代码的详细信息; OP不提供 repex.
跨线程很简单。 尽管您可能想使用互斥锁来保护访问。
跨进程意味着写入文件描述符, 例如管道或 mmap 文件。 最简单的事情是将行附加到日志文件中, 或在关系数据库中插入行。