当前位置: 首页 > 知识库问答 >
问题:

对python asyncio gRPC客户端的多线程支持

雍马鲁
2023-03-14

我有一个异步gRPC客户端,用于多线程环境。当多个线程通过客户端同时连接到服务时,我看到以下错误流:

2021-01-27 09:33:56,937 ERROR [asyncio] [thread_0] Exception in callback PollerCompletionQueue._handle_events()()
handle: )()>
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/asyncio/events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi", line 147, in grpc._cython.cygrpc.PollerCompletionQueue._handle_events
BlockingIOError: [Errno 11] Resource temporarily unavailable
2021-01-27 09:33:56,937 ERROR [asyncio] [thread_1] Exception in callback PollerCompletionQueue._handle_events()()
handle: )()>
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/asyncio/events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
  File "src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi", line 147, in grpc._cython.cygrpc.PollerCompletionQueue._handle_events
BlockingIOError: [Errno 11] Resource temporarily unavailable

请求似乎正在成功完成,但是,这些消息充斥着我的日志,让我感到紧张!

在我的测试中,每个线程创建自己的通道并提交自己的异步请求。无论服务负载如何,都会发生错误。如果客户端在不同的进程中运行,则不会发生错误。

我的设置:

  • Python版本:3.8。6
  • grpcioversion:1.35。0

任何洞察都将不胜感激!

共有1个答案

薛经纶
2023-03-14

gRPC异步IO使用UDS在C扩展和Python之间进行通信。从您的日志中,存在fd访问的竞争条件。AsyncIO API支持多线程,但这似乎是一个新问题(它有助于在上创建问题)https://github.com/grpc/grpc/issues).

竞争条件的修复可能很棘手,因为AsyncIO使用的AsyncIO锁不是线程安全的。如果我们用线程安全锁保护fd,它可能会阻塞AsyncIO循环。随时提出或贡献解决方案。

如果让所有客户端在一个线程上运行,AsyncIO的性能最好。事件循环可以很好地处理协同路由的执行,而不需要线程跳转。如您所述,如果目标是饱和机器上的所有计算能力,那么最好使用多重处理。

链接到基本gRPC AsyncIO示例:https://github.com/grpc/grpc/blob/master/examples/python/helloworld/async_greeter_client.py

 类似资料:
  • 问题内容: 我正在使用以下代码创建多个JMS会话,以供多个使用者使用消息。我的问题是代码以单线程方式运行。即使消息存在于队列中,第二个线程也无法接收任何内容,而是继续轮询。同时,第一个线程完成对第一批的处理,然后返回并使用剩余的消息。这里的用法有什么问题吗? 问题答案: 您的问题是prefetchPolicy。 所有消息都被分派到第一个连接的使用者,当另一个连接时他没有收到消息,因此,如果您有一个

  • 问题内容: 我正在尝试使用我一直在努力的客户端/服务器程序实现多线程。我需要允许多个客户端同时连接到服务器。我目前有4类:客户端,服务器,协议和用于处理线程的工作器。以下代码是我对这些类的拥有的代码: SocketServer类: SocketClient类别: 协议类别: ClientWorker类: 当我运行服务器和客户端时,一切正常。然后,当我尝试运行另一个客户端时,它只是挂在那儿,没有提示

  • 我正在使用java客户端连接到hazelcast集群。每次我连接到集群时,我都会观察到在成员的jvm上创建了大约5个客户机线程。这些线程在被销毁之前会停留大约30-40秒。这些线是什么?如何控制创建的客户端线程数? 我正在使用hazelcast all。3.3.3

  • 本文向大家介绍python多线程socket编程之多客户端接入,包括了python多线程socket编程之多客户端接入的使用技巧和注意事项,需要的朋友参考一下 Python中实现socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务 端用有很多模块可以使用,如下: 1、客户端 2、SocketServer模块 为了能够让多个客户端同时接入服务并进行通

  • 我是python套接字编程的初学者,正在尝试编写一个与联网家庭自动化设备(GlobalCache GC100)接口的库 我既需要通过TCP不断监听来自该硬件的传感器状态变化事件,也需要能够在用户发起的时间发送set_state命令(trip relays),而没有明显的延迟。 我有一个循环,它执行来拾取状态更改事件。这通常会超时()并继续到下一个循环迭代,直到设备推送状态更改数据。 我是想做套接字

  • 我正在考虑使用Ignite和。NET客户机进行一个项目。 我很好奇客户机是否支持。NET核心,因此可以在。NET核心应用程序中使用。 如果没有,未来是否计划了。NET核心支持?