首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多处理- get_lock与Lock

多处理- get_lock与Lock
EN

Stack Overflow用户
提问于 2018-11-06 16:35:50
回答 1查看 2.4K关注 0票数 1

在搜索有关共享多处理变量的信息时,我注意到有两种方法可以更新共享多处理变量:

代码语言:javascript
复制
# Our shared variable
total_uploaded_files = multiprocessing.Value('I', 0)
lock = multiprocessing.Lock()

# Method A
def my_multiprocessing_worker():
    global total_uploaded_files
    # do stuff ...
    with total_uploaded_files.get_lock():
        # increment shared counter
        total_uploaded_files.value += 1

# Method B
def my_multiprocessing_worker():
    global total_uploaded_files, lock
    # do stuff ...
    with lock:
        # increment shared counter
        total_uploaded_files.value += 1

有什么区别,应该选择哪种方法来实现多处理计数器,例如。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-06 17:21:26

使用get_lock()方法的multiprocessing.Value意味着使用对象的代码不需要关心Lock的源(因为它可以自动创建或在创建Value实例时显式传递)。

另一方面,有些人可能认为方法B更明确,因此认为它是更好的方法。

更重要的是,考虑另一种“混合”的可能性:

代码语言:javascript
复制
from contextlib import contextmanager

# Method C
@contextmanager
def locked(value):
    with value.get_lock():
        yield

def my_multiprocessing_worker():
    global total_uploaded_files
    # do stuff ...
    with locked(total_uploaded_files):
        # increment shared counter
        total_uploaded_files.value += 1

所以,在我看来,底线是,它最终只是一个选择的问题和首选的编程风格.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53176140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档