python - Zerorpc 异步调用
问题描述
服务器
假设我有以下 zerorpc 服务器
#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)
客户
和一个同时发送多个请求的客户端应用程序
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 没有开始运行。
所需的输出是:
1 - started long_running_task
1 - started other_task
2 - finished other_task
2 - finished long_running_task
代替
1 - started long_running_task
2 - finished long_running_task
1 - started other_task
2 - finished other_task
解决方案
这里有几个错误
async_
应该是async
。这确保客户端方法立即返回- ZeroRPC 与 gevent 一起工作。所以你需要用
gevent.spawn(s.run)
. 还要保持你的主要greenlet运行。
zerorpc.gevent.spawn(s.run)
while True:
zerorpc.gevent.sleep(10)
- 以上2是不够的。在
API()
方法上你也需要合作。而不是time.sleep()
使用gevent.sleep()
.
推荐阅读
- react-native - 有没有办法改变 react-native-paper 中按钮元素的底层颜色?
- c - 将接收到的参数传递给回调函数
- collections - MFC:覆盖 CMap<> 对象的 HashKey() 的正确方法?
- javascript - 无法使用 Javascript 将 HTML 按钮元素的标题或值设置为 C 度符号
- bash - 用sed中的另一个变量替换一个变量
- wpf - 创建命令或路由事件的快捷键是什么?
- dart - Can we set multiple callbacks with cascade notation using the arrow syntax in Dart?
- datastax - 需要帮助启动 DSE Graph
- python - 敌人精灵在被击中之前不会出现在 pygame 中
- python - 无法编译 PostgreSQL 并显示错误消息“找不到 Python 的共享库”