首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在应用程序中使用zerorpc引发错误“操作将永远阻塞”

在应用程序中使用zerorpc引发错误“操作将永远阻塞”
EN

Stack Overflow用户
提问于 2019-05-21 21:08:09
回答 1查看 362关注 0票数 0

我有一个使用Python中的zerorpc的RPC服务器,它是这样编写的

代码语言:javascript
复制
import zerorpc
from service import Service

print('RPC server - loading')
def main():
    print('RPC server - main')
    s = zerorpc.Server(Service())
    s.bind("tcp://*:4242")
    s.run()

if __name__ == "__main__" : main()

当我创建一个客户端时,它可以正常工作。

代码语言:javascript
复制
import zerorpc, sys

client_rpc = zerorpc.Client()
client_rpc.connect("tcp://127.0.0.1:4242")
name = sys.argv[1] if len(sys.argv) > 1 else "dude"
print(client_rpc.videos('138cd9e5-3c4c-488a-9b6f-49907b55a040.webm'))

并运行它。print()输出这个“视频”函数返回的内容。

但是,当我尝试使用来自Flask应用程序的路由内部相同的代码时,我会收到以下错误:

gevent.__greenlet_primitives._greenlet_switch gevent.exceptions.LoopExit中的第35行文件“src/gevent/__greenlet_pritives.pxd”:此操作将永远阻止集线器:

烧瓶法/摘录

代码语言:javascript
复制
import zerorpc, sys

client_rpc = zerorpc.Client()
client_rpc.connect("tcp://127.0.0.1:4242")

@app.route('/videos', methods=['POST'])
def videos():

    global client_rpc
    client_rpc.videos('138cd9e5-3c4c-488a-9b6f-49907b55a040.webm')

我不知道可能发生了什么。我对Python非常陌生,我知道这可能与Flask和它如何处理线程有关,但我不知道如何解决它。

EN

回答 1

Stack Overflow用户

发布于 2019-05-22 16:25:51

zerorpc依赖于gevent,它提供具有协作协同的异步IO。这意味着您的烧瓶应用程序必须在所有IO操作中使用gevent。

在您的特定情况下,您可能使用标准阻塞IO服务器启动应用程序。

下面是使用gevent中的WSGI服务器的一个片段:

代码语言:javascript
复制
import zerorpc
from gevent.pywsgi import WSGIServer

app = Flask(__name__)

client_rpc = zerorpc.Client()
client_rpc.connect("tcp://127.0.0.1:4242")

@app.route('/videos', methods=['POST'])
def videos():
    global client_rpc
    client_rpc.videos('138cd9e5-3c4c-488a-9b6f-49907b55a040.webm')

# ...

if __name__ == "__main__":
    http = WSGIServer(('', 5000), app)
    http.serve_forever()

https://sdiehl.github.io/gevent-tutorial/#chat-server摘录

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

https://stackoverflow.com/questions/56246394

复制
相关文章

相似问题

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