如何同步一个python字典有多重

如题所述

介绍

似乎有很多的扶手椅建议和没有工作的例子。没有列在下面,甚至多重的答案,这是颇有几分失望和不安。由于python爱好者,我们应该支持我们的内置库,并同时并行处理和同步从来都不是小事,我相信它可以制成琐碎与适当的设计。这是很重要的现代多核架构,并且不能够underline!话虽如此

CodeGo.net,我远远满足多处理库,它仍然是处于起步阶段的阶段与不少缺陷,错误,并正在面向函数式编程(我讨厌)。目前我还是比较喜欢火焰兵模块(这是遥遥领先其对多重的因无法在服务器运行时共享新创建的对象多处理的严重限制。“注册”的管理对象只能实际注册一个对象之前管理(或服务器)开始数落够了,更多的代码:
Server.py
from multiprocessing.managers import SyncManager

class MyManager(SyncManager):
pass

syncdict = {}
def get_dict():
return syncdict
if __name__ == "__main__":
MyManager.register("syncdict", get_dict)
manager = MyManager(("127.0.0.1", 5000), authkey="password")
manager.start()
raw_input("Press any key to kill server".center(50, "-"))
manager.shutdown()

多重的SyncManager,可以提供同步共享对象的Server.py在上面的代码示例。此代码将不能工作在解释多处理库是如何找到“可赎回”为每个注册的对象相当棘手的运行。运行Server.py将启动一个定制SyncManager共享多个进程的syncdict字典,并且可以连接到客户端机或者机器上,或者,如果运行在比回环,其他机器的其他的IP地址。在这种情况下,服务器运行在环回(127.0.0.1)端口5000。操作syncdict当使用authkey使用安全连接。当任何一个键被按下的管理是关机。
Client.py
from multiprocessing.managers import SyncManager
import sys, time
class MyManager(SyncManager):
pass
MyManager.register("syncdict")
if __name__ == "__main__":
manager = MyManager(("127.0.0.1", 5000), authkey="password")
manager.connect()
syncdict = manager.syncdict()
print "dict = %s" % (dir(syncdict))
key = raw_input("Enter key to update: ")
inc = float(raw_input("Enter increment: "))
sleep = float(raw_input("Enter sleep time (sec): "))
try:
#if the key doesn't exist create it
if not syncdict.has_key(key):
syncdict.update([(key, 0)])
#increment key value every sleep seconds
#then print syncdict
while True:
syncdict.update([(key, syncdict.get(key) + inc)])
time.sleep(sleep)
print "%s" % (syncdict)
except KeyboardInterrupt:
print "Killed client"

客户端端还必须创建一个自定义的SyncManager,注册“syncdict”,这个没有传入一个可调用来检索共享字典。它定制到5000端口的环回IP地址(127.0.0.1)和authkey建立与管理的安全连接开始Server.py。它通过调用注册的调用上的管理器检索共享字典syncdict。它提示如下:
在syncdict的关键,操作上
该款项由键访问时的值每个周期
在几秒钟内每个周期sleep的金额
然后,客户端端会检查看是否存在的关键。如果它不它创建的syncdict关键。然后,客户端端进入一个“没完没了”循环,它会更新密钥的值由指定的金额sleep,并打印syncdict只是直到KeyboardInterrupt发生(CTRL
+C)重复此过程。
恼人的问题
该管理器启动,否则你会得到异常,即使在管理器中的目录调用就会发现,它确实是有被注册前管理人必须被调用。
该词典的所有的操作一定要做的,不是字典(syncdict [“爆破”]=2就会失败的路多处理器共享自定义对象)
使用SyncManager的将减轻恼人的问题#2,除了恼人的问题#1防止由SyncManager.dict()被注册和共享返回的代理。
(SyncManager.dict()只能被称为后的管理器启动,并注册只会工作的管理开始之前这样SyncManager.dict()是做函数式编程和通过代理进程作为一个像文档的例子做的时候)
在服务器和客户端端必须注册,即使直觉它会看起来像客户端端将只能够连接到管理后,看着办吧(请添加到您的愿望清单多处理开发人员)
闭幕

我希望你喜欢这个相当彻底,稍有回答,就像我有。我有一个很大的trouble直在我的脑海,为什么我挣扎了这么多的多处理模块,其中火焰兵是一件轻而易举的,现在多亏了这个答案我已经击中了要害。我希望这给如何提高多处理器模块,因为我相信它有一个很大的承诺,但处于起步阶段达不到什么是可能的。尽管描述的恼人的问题,我认为这仍然是一个相当可行的替代方案,是非常简单的。你可以SyncManager.dict(),并把它传递给进程作为该文档显示方式,它很可能是一个更简单的解决方案,根据您的它只是感觉不自然
2.
有没有字典需要被摆在首位共享的理由吗?你可以有每一个线程维护自己的字典,并在线程处理或个别线程字典在一起的回拨副本年底实例?
我不知道到底你在做什么,所以请我的,我的书面计划可能无法正常工作一字不差。什么我的建议是更多的是一种高层次的设计理念。
3.
我将致力于一个单独的进程,以维护“共享字典”:例如: xmlrpclib使代码提供给其他进程少量,通过xmlrpclib如暴露一个函数,该函数key, increment执行和一个刚服用的key和返回值,用语义细节(是否有丢失的钥匙,等,等一个默认值),这取决于你的应用程序的需求。
那么你任何你喜欢的共享专用字典过程方法:从一个简单的字典一个单线程的服务器一直到一个简单的sqlite的数据库,等等,等等,我建议你开始与代码“就这么简单,你可以得到破除“(取决于你是否需要一个永久共享字典,或持久性是没有必要给你),和,如果需要优化。
4.
响应于适当的溶液中,以并行写入的问题。我做了非常快速的研究,发现这篇文章是在暗示一个锁定/信号的解决方案。 (
虽然这个例子是不是特异性的一本字典,我敢肯定,你可以编写一个基于类的包装对象,以帮助您基于这种想法词典的工作。
如果我有一个喜欢这个以线程安全的方式,我倒是Python的信号量解决方案。 (假设我的技术是行不通的。)我相信,信号量普遍放缓,由于其性质阻塞线程的效率。
从网站:
信号量是一个比较先进的信号量有一个内部的计数器,而不是一个锁标志,并且它只有块如果超过线程给定数量的试图保持信号量。根据如何在信号量被初始化,这允许多个线程访问代码段

semaphore = threading.BoundedSemaphore()
semaphore.acquire() # decrements the counter
... access the shared resource; work with dictionary, add item or whatever.
semaphore.release() # increments the counter
温馨提示:答案为网友推荐,仅供参考
相似回答