我试着查看documentation在ZODB数据库上运行ZEO,但是它们的工作方式并不正常。 我可以让常规的ZODB正常运行,但是我想通过程序的几个进程来访问数据库,所以我试图让ZEO工作。
我在一个包含子文件夹zeo的文件夹中创建了这个脚本,该文件夹将保存make_server
函数在不同并行进程中创建的“database.fs”文件:
CODE:
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)
我可能做错了什么?我只是想让它现在在本地工作,所以不应该有任何花哨的网页内容。
答案 0 :(得分:1)
您应该使用适当的流程管理并简化您的生活。您可能希望查看supervisor,它可以负责运行/启动/停止您的应用程序和ZEO。
否则,您需要查看double-fork技巧来守护ZEO - 但是为什么像主管这样的流程管理工具会为您做这件事。
如果您精通关系数据库管理,并且已经有一个关系数据库供您使用 - 您还可以将RelStorage视为一个非常好的ZODB(低级)存储后端。
答案 1 :(得分:1)
在Windows中,您应该在路径中使用double \而不是单个\。简单易用的方法是使用os.path.join()函数,例如。 os.path.join('os.getcwd()', 'zeo', 'database.fs')
。否则类似的代码对我来说没问题。
答案 2 :(得分: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