出于学术目的,我需要开发一个使用ZODB和一些轻量级Web服务器的演示应用程序,比如CherryPy。 ZODB以只读方式使用。客户端查询服务器端ZODB。服务器应该“让多个进程同时访问ZODB”。
Zope文档说“ ZEO是让多个进程同时访问ZODB的唯一方法。”但是我应该如何理解和实现这个ZEO呢?
为了清楚起见,我写了一些代码,只是一个简单的TCP服务器:
import SocketServer
import ZODB
from ZEO import ClientStorage
from ZODB.DB import DB
addr = ('localhost', 9999)
storage = ClientStorage.ClientStorage(addr)
zdb = DB(storage)
# or the following method:
# import ZODB.config
# zdb = ZODB.config.databaseFromURL('zeo.conf')
class MyTCPHandler(SocketServer.BaseRequestHandler):
def ZODBThing(self, rec_id):
con = zdb.open()
records = con.root()['records']
buff=records[int(rec_id)]
con.close()
return buff
def handle(self):
self.data = self.request.recv(1024).strip()
self.request.sendall(str(self.ZODBThing(self.data)))
if __name__ == "__main__":
HOST, PORT = "localhost", 9998
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
zdb.close()
storage.close()
答案 0 :(得分:1)
对于打开多个连接并通过每个线程连接处理并发的单个进程,您不需要ZEO。使用FileStorage(而不是ClientStorage),您可以使用上面的示例代码执行单个进程,因为每个应用程序只有一个ZODB.DB.DB对象。
然而,一旦你得到的不仅仅是琐碎的流量,Python的缩放模型通常不能很好地与一个进程中的许多线程一起使用(由于Global Interpreter Lock) - 你通常需要在一个进程中使用一些进程主机利用多个CPU核心,此时您需要像ZEO或RelStorage之类的东西作为后端,以便多个进程共享同一个数据库。
注意:在任何规模上,您可能都希望使用某种连接池(只重用它们,一次只能使用一个),而不是在每个请求上创建连接。