【问题标题】:How do I create an asynchronous socket in Python?如何在 Python 中创建异步套接字?
【发布时间】:2018-01-04 03:27:27
【问题描述】:

我为 Telnet 通信创建了一个套接字对象,并使用它与 API 通信,发送和接收数据。我需要将其配置为可以同时发送和接收数据。我的意思是,一旦应用程序尝试发送数据,就应该发送数据,并且数据应该在收到后立即处理。目前,我有一个配置,它允许即时接收,并以非常短的延迟发送第二优先级。

目前我发现做到这一点的最佳方法是拥有一个事件队列,并将数据推送到其中,然后有一个响应队列,我将来自服务器的消息放入其中。我有一个线程每 0.1 秒轮询一次缓冲区以检查新数据,如果没有,它会检查请求队列并处理那里的任何内容,并且在连续循环中运行。然后我让线程将数据插入请求队列,并从响应队列中读取数据。一切都几乎是线性的,这可以正常工作。

这不是“异步”,从某种意义上说,我不得不尽可能地异步而没有真正实现它。有没有合适的方法来做到这一点?或者引擎盖下的任何事情都会和我做的完全一样?

我为解决这个问题而调查的其他事情:

  • 一个回调系统,我可能会调用socket.on_receipt(handle_message, args)以args作为参数调用方法handle_message,将接收到的数据传递给方法。我能找到实现这一点的唯一方法是实现我已经拥有的,然后为它注册一个回调(事实上,这非常接近我已经拥有的)。

请注意:我将此作为学习练习来更好地了解异步系统的工作原理,而不是了解如何使用特定库,因此请不要推荐现有库,除非它包含非常清晰且易于使用的代码完整而简洁地理解并回答问题。

【问题讨论】:

    标签: python multithreading sockets asynchronous


    【解决方案1】:

    这似乎是一个非常简单的 asyncio 用例。我不会考虑将 asyncio 用作“使用特定库”,因为与 asyncio 的事件循环配对的套接字编程非常低级,如果您有其他语言的经验并且只想了解异步编程的工作原理,那么这个概念非常透明蟒蛇。

    您可以以此异步聊天为例:https://gist.github.com/gregvish/7665915

    本质上,您创建了一个非阻塞套接字,请参阅socket.setblocking(0) 上的标准库参考:

    https://docs.python.org/3/library/socket.html#socket.socket.setblocking

    我还建议将 David Beazley 的精彩课程作为异步 Python 编程的必看课程。他使用套接字解释了 Python 中的并发概念,正是您所需要的:https://www.youtube.com/watch?v=MCs5OvhV9S4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      相关资源
      最近更新 更多