python multiprocessing.double 的值原子读写

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

我正在 python 中使用 multiprocessing.Value 类,并且我有一个设置值的写入器进程和一个读取值的读取器进程。假设我的编写器进程仅以shared_value.value = new_value(而不是像shared_value+=1那样的读取-修改-写入)方式设置值,并且我的读取器通过new_value=shared_value.value读取,这个进程安全吗?我可以不使用锁吗在这种情况下?

python multiprocessing python-multiprocessing
1个回答
0
投票

在Python的multiprocessing模块中,当您使用multiprocessing.Value类在进程之间共享数据时,您需要了解在并发环境中如何访问和修改值。在您的情况下,您有一个设置值的写入器进程和一个读取它的读取器进程。

写入器进程:直接使用shared_value.value = new_value 设置值。

读取器进程:使用 new_value = shared_value.value 读取值。

在另一个进程中写入shared_value.value,而另一个进程正在读取它,可能会导致竞争条件。竞争条件可能不会每次都发生,但如果读取和写入操作同时发生,则可能会发生竞争条件。这可能会导致读者获得陈旧或部分更新的值,从而导致意外的行为或错误。

这是一个使用 Lock 的小例子:

    from multiprocessing import Process, Value, Lock
import time

def writer(shared_value, lock):
    while True:
        with lock:
            new_value = ...
            shared_value.value = new_value
        time.sleep(1) 

def reader(shared_value, lock):
    while True:
        with lock:
            current_value = shared_value.value
        print(f'Read value: {current_value}')
        time.sleep(1)

if __name__ == '__main__':
    lock = Lock()
    shared_value = Value('i', 0) 
    writer_process = Process(target=writer, args=(shared_value, lock))
    reader_process = Process(target=reader, args=(shared_value, lock))

    writer_process.start()
    reader_process.start()

    writer_process.join()
    reader_process.join()
© www.soinside.com 2019 - 2024. All rights reserved.