您获得OperationalError: database is locked 的原因是2 个dev_appserver.py 实例会在尝试访问相同的数据库本地存储目录时发生冲突,默认情况下,该目录是根据应用程序的名称确定的——对于2 个服务相同同一个应用程序。
避免这种冲突的一种方法是同时指定本地存储目录,使用dev_appserver.py 的--storage_path 可选参数(您可以通过dev_appserver.py --help 查看):
--storage_path PATH path to the data (datastore, blobstore, etc.)
associated with the application. (default: None)
但是,使用 2 个不同的存储路径可能会产生意想不到的结果 - 如果您的服务引用该存储中应该是相同的信息,他们可能会看到不同的值。
将dev_appserver.py 用于同一应用的多个服务的正确方法是通过单个dev_appserver.py 实例运行所有服务,该实例将为每个服务分配不同的端口。
例如,我有一个包含 3 个服务并使用调度文件的应用程序。这就是我从应用程序目录调用开发服务器的方式,该应用程序目录是 3 个服务目录的父目录(调度文件必须是 .yaml 文件参数列表中的第一个,我总是使用默认模块的一个,在我的情况下main/main.yaml):
/usr/bin/python2.7 /usr/local/google_appengine/dev_appserver.py --host 0.0.0.0 --log_level=debug dispatch.yaml main/main.yaml buildin/buildin.yaml apartci/apartci.yaml
这就是开发服务器自动分配每个服务侦听的端口的方式,并在服务器启动时显示:
INFO 2016-11-18 14:20:53,329 api_server.py:205] Starting API server at: http://localhost:40310
INFO 2016-11-18 14:20:53,330 dispatcher.py:185] Starting dispatcher running at: http://0.0.0.0:8080
INFO 2016-11-18 14:20:53,345 dispatcher.py:197] Starting module "default" running at: http://0.0.0.0:8081
INFO 2016-11-18 14:20:53,353 dispatcher.py:197] Starting module "buildin" running at: http://0.0.0.0:8082
INFO 2016-11-18 14:20:53,361 dispatcher.py:197] Starting module "apartci" running at: http://0.0.0.0:8083
INFO 2016-11-18 14:20:53,362 admin_server.py:116] Starting admin server at: http://localhost:8000