Web services 带有轻量级web服务器的ZODB

Web services 带有轻量级web服务器的ZODB,web-services,zodb,Web Services,Zodb,出于学术目的,我需要开发一个演示应用程序,将ZODB与一些轻量级web服务器结合使用,比如CherryPy。ZODB是以只读方式使用的。客户端查询服务器端ZODB。服务器应该“有多个进程同时访问ZODB” Zope文档说“ZEO是让多个进程同时访问ZODB的唯一方法。”但是我应该如何理解和实现ZEO呢? 为了清晰起见,我编写了一些代码,只是一个简单的TCP服务器: import SocketServer import ZODB from ZEO import ClientStorage from

出于学术目的,我需要开发一个演示应用程序,将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的目的和用途是什么?

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

但是,一旦获得的流量超过了普通流量,Python的扩展模型通常无法在一个进程中处理多个线程(由于全局解释器锁定)——您通常希望单个主机上的多个进程利用多个CPU核,此时,您需要ZEO之类的东西,或者作为多个进程共享同一数据库的后端

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