我在python flask中为jasminsgateway编写一个web服务来创建和删除网关中的用户。在POST请求的情况下,我调用runScenario(),然后启动反应器.运行()将在网关中创建用户。这段代码在第一次web服务调用中运行得很好,但是在第二次调用时,它给了我一个错误:
raise error.ReactorNotRestartable()
ReactorNotRestartable
这是我的烧瓶应用程序:
^{pr2}$我调用runScenario(),它在茉莉花综合.py在
#!/usr/bin/env python
import sys
import pickle
from flask import abort
from twisted.internet import defer, reactor
from jasmin.managers.proxies import SMPPClientManagerPBProxy
from jasmin.routing.proxies import RouterPBProxy
from jasmin.routing.Routes import DefaultRoute
from jasmin.routing.jasminApi import SmppClientConnector, User, Group, MtMessagingCredential, SmppsCredential
from jasmin.protocols.smpp.configs import SMPPClientConfig
from twisted.web.client import getPage
@defer.inlineCallbacks
def runScenario(Request):
try:
proxy_router = RouterPBProxy()
yield proxy_router.connect('127.0.0.1', 8988, 'radmin', 'rpwd')
if Request.method == 'POST':
smppUser = Request.json['username']
smppPass = Request.json['password']
smppThroughput = Request.json['tp']
smppBindSessions = Request.json['sessions']
if not smppUser:
abort(400)
if len(smppPass) == 0 or len(smppPass) > 8:
abort(400)
if not smppThroughput.isdigit():
abort(400)
if not smppBindSessions.isdigit():
abort(400)
# Provisiong router with users
smpp_cred = SmppsCredential()
yield smpp_cred.setQuota('max_bindings',int(smppBindSessions))
mt_cred = MtMessagingCredential()
yield mt_cred.setQuota('smpps_throughput' , smppThroughput)
#yield mt_cred.setQuota('submit_sm_count' , 500)
g1 = Group('clients')
u1 = User(uid = smppUser, group = g1, username = smppUser, password = smppPass, mt_credential = mt_cred, smpps_credential = smpp_cred)
yield proxy_router.group_add(g1)
yield proxy_router.user_add(u1)
if Request.method == 'DELETE':
smppUser = Request.json['username']
if not smppUser:
abort(404)
yield proxy_router.user_remove(smppUser)
except Exception, e:
yield "%s" %str(e)
finally:
print "Stopping Reactor"
reactor.stop()
请帮我解决这个问题:
Reactor在Twisted by design中是不可重启的,它执行不容易重启的初始化和终结。在
在所提供的示例中,您使用的是开发WSGI服务器(flask的默认服务器,http://werkzeug.pocoo.org/docs/0.11/serving/),默认情况下它是单线程的。在
如果您避免使用线程而改用多进程服务器,那么您的问题就会消失。 i、 e.如果您只是这样运行它就可以了(请参见processes=2=>;每个请求将在一个新的进程中处理,但不超过2个并发请求):
但我不相信这一点——编写单元测试时,您会遇到类似的问题,并将您的应用程序限制在多进程环境中运行不是一个好方法。在
但问题似乎源于你的应用程序设计——为什么你需要Flask和一个额外的WSGI服务器? 您可以在twisted中完全构建restapi,最终只运行一个reactor,它将处理对API的查询和传入的请求。在
你不能让反应堆停下来再运转。你得到的错误是故意的。考虑使用}进行联网。语法甚至相似。将代码转换为
klein
,它使用werkzeug
类似flask
,并利用{klein
将有点像这样:另外,除非您想完全退出应用程序,否则不应停止
reactor
。在@f上次我也试着在twisted中做,但遇到了同样的问题,因为反应堆没有可重新启动。输入我做过这样的事:
相关问题 更多 >
编程相关推荐