python manager.dict()锁定的工作方式: [英] How python manager.dict() locking works:
问题描述
A managers.dict()允许跨进程共享字典并执行线程安全操作.
在我的情况下,每个协调程序进程都使用m
元素创建共享的dict,而n
工作进程则对单个dict键进行读写操作.
A managers.dict() allow to share a dictionary across process and perform thread-safe operation.
In my case each a coordinator process create the shared dict with m
elements and n
worker processes read and write to/from a single dict key.
managers.dict()
的dict锁或m
的锁是否只有一个,而其中的每个键都有一个?
Do managers.dict()
have one single lock for the dict or m
locks, one for every key in it?
当共享对象不需要彼此通信时,是否有其他方法可以将共享m
元素共享给n
共享对象?
Is there an alternative way to share m
elements to n
workers, other than a shared dict, when the workers do not have to communicate with each other?
相关 python-manager-dict-is-与常规字典相比非常慢
推荐答案
经过一番尝试,我可以说每个管理人员命令只有一个锁. 这是证明它的代码:
After some tries I can say there is only one lock per managers dict. Here is the code that proves it:
import time
import multiprocessing as mp
def process_f(key, shared_dict):
values = [i for i in range(64 * 1024 * 1024)]
print "Writing {}...".format(key)
a = time.time()
shared_dict[key] = values
b = time.time()
print "released {} in {}ms".format(key, (b-a)*1000)
def main():
process_manager = mp.Manager()
n = 5
keys = [i for i in range(n)]
shared_dict = process_manager.dict({i: i * i for i in keys})
pool = mp.Pool(processes=n)
for i in range(n):
pool.apply_async(process_f, (keys[i], shared_dict))
time.sleep(20)
if __name__ == '__main__':
main()
输出:
Writing 4...
Writing 3...
Writing 1...
Writing 2...
Writing 0...
released 4 in 3542.7968502ms
released 0 in 4416.22900963ms
released 1 in 6247.48706818ms
released 2 in 7926.97191238ms
released 3 in 9973.71196747ms
Process finished with exit code 0
写作时间的增加表明正在等待.
The increasing time for writing show the waiting which is happening.
这篇关于python manager.dict()锁定的工作方式:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!