Zerorpc 异步调用
Zerorpc asynchronous calls
服务器
假设我有以下 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
。这确保客户端方法 returns 立即
- ZeroRPC 与 gevent 一起工作。所以你需要用
gevent.spawn(s.run)
来启动服务器。还要保留您的主要绿叶 运行.
zerorpc.gevent.spawn(s.run)
while True:
zerorpc.gevent.sleep(10)
- 以上 2 是不够的。在
API()
方法中,您也需要合作。而不是 time.sleep()
使用 gevent.sleep()
.
服务器
假设我有以下 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
。这确保客户端方法 returns 立即- ZeroRPC 与 gevent 一起工作。所以你需要用
gevent.spawn(s.run)
来启动服务器。还要保留您的主要绿叶 运行.
zerorpc.gevent.spawn(s.run)
while True:
zerorpc.gevent.sleep(10)
- 以上 2 是不够的。在
API()
方法中,您也需要合作。而不是time.sleep()
使用gevent.sleep()
.