多处理 value() ctypes.c_wchar_p 导致线程卡住,替代方案吗?

问题描述 投票:0回答:1

我正在使用 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 上

python python-3.x python-multiprocessing python-multithreading
1个回答
0
投票

有没有办法跨多处理和线程分发可编辑的全局变量字符串?

您提供了一些有关代码的详细信息; OP不提供 repex.

跨线程很简单。 尽管您可能想使用互斥锁来保护访问。

跨进程意味着写入文件描述符, 例如管道或 mmap 文件。 最简单的事情是将行附加到日志文件中, 或在关系数据库中插入行。

© www.soinside.com 2019 - 2024. All rights reserved.