0

出于学术目的,我需要开发一个演示应用程序,将 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()
  • 以上代码代表了我对ZEO使用的理解。我需要知道我的理解是对还是错。
  • zeoctl.exe 的用途和用途是什么?
4

1 回答 1

1

对于打开多个连接并通过每个线程一个连接处理并发的单个进程,您不需要 ZEO。使用 FileStorage(而不是 ClientStorage),您可以使用上面的示例代码执行单进程,因为每个应用程序只有一个 ZODB.DB.DB 对象。

但是,一旦您获得的流量不只是微不足道的流量,Python 的扩展模型通常不适用于一个进程中的多个线程(由于 Global Interpreter Lock)——您通常希望单个主机上的一些进程利用多个 CPU核心,此时您需要像 ZEO 或RelStorage这样的东西作为多个进程共享同一个数据库的后端。

注意:在任何规模下,您都可能希望使用某种连接池(只需重用它们,一次只能使用一个),而不是在每个请求上创建连接。

于 2013-11-11T06:19:21.643 回答