首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Zerorpc异步调用

Zerorpc异步调用
EN

Stack Overflow用户
提问于 2019-04-14 17:33:57
回答 1查看 966关注 0票数 1

服务器

假设我有以下zerorpc服务器

代码语言:javascript
复制
#server side
import zerorpc

class API():

    def long_running_task(self):
        print('1 - started long_running_task')
        #for instance a long running SQL query
        zerorpc.gevent.sleep(10)
        print('2 - finished long_running_task')

    def other_task(self):
        print('1 - started other_task')
        pass
        print('2 - finished other_task')

s = zerorpc.Server(API())
s.bind("tcp://0.0.0.0:4444")
zerorpc.gevent.spawn(s.run)
while True:
    zerorpc.gevent.sleep(10)

客户端

以及同时发送多个请求的客户端应用程序

代码语言:javascript
复制
import zerorpc

client = zerorpc.Client()
client.connect("tcp://127.0.0.1:4444")

client.long_running_task(async_=True)
client.other_task(async_=True)

client.close()

问题是,当long_running_task正在执行时,other_task并没有开始运行。

所需的输出为:

代码语言:javascript
复制
1 - started long_running_task
1 - started other_task
2 - finished other_task
2 - finished long_running_task

而不是

代码语言:javascript
复制
1 - started long_running_task
2 - finished long_running_task
1 - started other_task
2 - finished other_task
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-14 17:48:37

这里有几个错误

  1. async_应为async。这确保了客户端方法返回的immediately
  2. ZeroRPC可以与gevent一起工作。因此,您需要使用gevent.spawn(s.run)启动服务器。也可以让你的主greenlet保持运行。

代码语言:javascript
复制
zerorpc.gevent.spawn(s.run)
while True:
     zerorpc.gevent.sleep(10)

  1. 高于2是不够的。在API()方法中,您也需要合作。使用gevent.sleep().

代替time.sleep()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55673826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档