ZODB与轻量级Web服务器

时间:2013-11-10 20:40:52

标签: web-services zodb

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

1 个答案:

答案 0 :(得分:1)

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

然而,一旦你得到的不仅仅是琐碎的流量,Python的缩放模型通常不能很好地与一个进程中的许多线程一起使用(由于Global Interpreter Lock) - 你通常需要在一个进程中使用一些进程主机利用多个CPU核心,此时您需要像ZEO或RelStorage之类的东西作为后端,以便多个进程共享同一个数据库。

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