get_lock vs Lock



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

# 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

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

感谢

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

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

为了让事情变得更混乱,考虑另一种"混合"的可能性:

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

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

相关内容

  • 没有找到相关文章

最新更新