延迟的Klein应用程序

2024-03-29 10:43:08 发布

您现在位置:Python中文网/ 问答频道 /正文

克莱因的探索被推迟了。在下面的示例中,我尝试使用子进程递增一个数字,并通过Future返回它。我能接到未来的回电。在

问题是deferred object从不调用cb()函数,对endpoint的请求也从不返回。请帮我找出问题所在。在

以下是我的服务器.py代码

from klein import Klein
from twisted.internet.defer import inlineCallbacks, returnValue
import Process4

if __name__ == '__main__':
    app = Klein()

    @app.route('/visit')
    @inlineCallbacks
    def get_num_visit(request):        
        try:
            resp = yield Process4.get_visitor_num()
            req.setResponseCode(200)
            returnValue('Visited = {}'.format(resp))
        except Exception as e:
            req.setResponseCode(500)
            returnValue('error {}'.format(e))

    print('starting server')
    app.run('0.0.0.0', 5005)

下面是Process4.py代码

^{2}$

编辑1

在启动进程p1之前添加回调可以解决调用cb()函数的问题。但是对端点的http请求仍然没有返回。在


Tags: 函数代码frompyimportappget进程
1条回答
网友
1楼 · 发布于 2024-03-29 10:43:08

结果发现,在run()方法中设置future resultself.f.set\u result(result=r)会触发子进程中的callback()方法,其中没有线程等待结果返回!在

因此,为了在主进程中触发callback()函数,我必须使用主进程中的工作线程使用多进程队列从子进程中获取结果,然后设置未来的结果。在

在@臭名昭著。不谢谢你的回复。我注意到的一件事是reactor.callFromThread在我修改过的代码中,是否从工作线程切换到主线程,但是d.callback(f.result())工作正常,但从工作线程返回结果。在

以下是修改后的工作代码

在服务器.py在

from klein import Klein
from twisted.internet.defer import inlineCallbacks, returnValue


import Process4

if __name__ == '__main__':
    app = Klein()
    visit_count = 0

    @app.route('/visit')
    @inlineCallbacks
    def get_num_visit(req):
        global visit_count
        try:
            resp = yield Process4.get_visitor_num(visit_count)
            req.setResponseCode(200)
            visit_count = resp
            returnValue('Visited = {}'.format(resp))
        except Exception as e:
            req.setResponseCode(500)
            returnValue('error {}'.format(e))

    print('starting server')
    app.run('0.0.0.0', 5005)

进程4.py

^{pr2}$

相关问题 更多 >