1

我尝试查看在 ZODB 数据库上运行 ZEO 的文档,但它并没有按照他们所说的那样工作。我可以让常规 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

这是运行服务器的进程的 cmd 提示符的输出:

------
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)

我可能做错了什么?我只是希望它现在可以在本地工作,所以不需要花哨的网络东西。

4

3 回答 3

1

在 Windows 中,您应该在路径中使用双 \ 而不是单个 \。实现这一点的简单且可移植的方法是使用 os.path.join() 函数,例如。os.path.join('os.getcwd()', 'zeo', 'database.fs'). 否则,类似的代码对我来说没问题。

于 2014-01-09T12:07:21.383 回答
1

您应该使用适当的流程管理并简化您的生活。您可能希望查看supervisor,它可以负责运行/启动/停止您的应用程序和 ZEO。

否则,您需要查看守护 ZEO的双叉技巧——但是当像主管这样的流程管理工具为您执行此操作时,何必费心呢。

如果您精通关系数据库管理,并且已经拥有一个可供您使用的关系数据库——您也可以将RelStorage视为一个非常好的 ZODB(低级)存储后端。

于 2013-12-04T23:56:00.067 回答
0

在 Windows 上也有同样的错误,在 Linux 上一切正常......你的代码没问题,为了让它工作改变如下 C:\Python33\Lib\site-packages\ZEO-4.0.0-py3.3.egg\ZEO\ zrpc\trigger.py ln:235

self.trigger.send(b'x')

C:\Python33\Lib\site-packages\ZEO-4.0.0-py3.3.egg\ZEO\zrpc\client.py ln:458:459 - 评论他们

这是那些行:

if socktype != socket.SOCK_STREAM:

    continue    
于 2014-01-16T16:18:12.787 回答