在搜索有关共享多处理变量的信息时,我注意到有两种方法可以更新共享多处理参数:
# 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.Value
的get_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
所以,在我看来,底线是,最终这只是一个选择和首选编程风格的问题。。。