我试着查看在zodb数据库上运行zeo的documentation,但它并没有按照他们说的那样工作。
我可以让一个常规的zodb正常运行,但是我想让一个程序的几个进程可以访问这个数据库,所以我正试图让zeo工作。
我在一个文件夹中创建了这个脚本,其中有一个子文件夹zeo,它将在不同的并行进程中保存make_server函数创建的“database.fs”文件:
代码:

from ZEO import ClientStorage
import ZODB
import ZODB.config
import os, time, site, subprocess, multiprocessing

# make the server in for the database in a separate process with windows command
def make_server():
    runzeo_path = site.getsitepackages()[0] + "\Lib\site-packages\zeo-4.0.0-py2.7.egg\ZEO\\runzeo.py"
    filestorage_path = os.getcwd() + '\zeo\database.fs'
    subprocess.call(["python", runzeo_path, "-a", "127.0.0.1:9100", "-f" , filestorage_path])

if __name__ == "__main__":
    server_process = multiprocessing.Process(target = make_server)
    server_process.start()
    time.sleep(5)
    storage = ClientStorage.ClientStorage(('localhost', 9100), wait=False)
    db = ZODB.DB(storage)
    connection = db.open()
    root = connection.root()

如果未给出ClientStorage,程序将仅在wait=False行阻塞。
如果给定wait=False,则会产生此错误:
错误消息:
Traceback (most recent call last):
  File "C:\Users\cbrown\Google Drive\EclipseWorkspace\NewSpectro - v1\20131202\2 - database\zeo.py", line 17, in <module>
    db = ZODB.DB(storage)
  File "C:\Python27\lib\site-packages\zodb-4.0.0-py2.7.egg\ZODB\DB.py", line 443, in __init__
    temp_storage.load(z64, '')
  File "C:\Python27\lib\site-packages\zeo-4.0.0-py2.7.egg\ZEO\ClientStorage.py", line 841, in load
    data, tid = self._server.loadEx(oid)
  File "C:\Python27\lib\site-packages\zeo-4.0.0-py2.7.egg\ZEO\ClientStorage.py", line 88, in __getattr__
    raise ClientDisconnected()
ClientDisconnected

以下是运行服务器的进程的命令提示符的输出:
------
2013-12-06T21:07:27 INFO ZEO.runzeo (7460) opening storage '1' using FileStorage

------
2013-12-06T21:07:27 WARNING ZODB.FileStorage Ignoring index for C:\Users\cab0008
\Google Drive\EclipseWorkspace\NewSpectro - v1\20131202\2 - database\zeo\databas
e.fs
------
2013-12-06T21:07:27 INFO ZEO.StorageServer StorageServer created RW with storage
s: 1:RW:C:\Users\cab0008\Google Drive\EclipseWorkspace\NewSpectro - v1\20131202\
2 - database\zeo\database.fs
------
2013-12-06T21:07:27 INFO ZEO.zrpc (7460) listening on ('127.0.0.1', 9100)

我会做错什么?我只想现在就在本地工作,这样就不需要什么花哨的网络内容了。

最佳答案

你应该使用适当的流程管理,简化你的生活。您可能希望查看supervisor,它负责运行/启动/停止您的应用程序和zeo。
否则,您需要查看对zeo进行daemonize的double-fork技巧——但是,当流程管理工具(如主管)为您这样做时,为什么还要费心呢?
如果您精通关系数据库管理,并且已经有了一个可以使用的关系数据库,那么您还可以考虑将RelStorage作为一个非常好的zodb(低级)存储后端。

10-06 15:55