如何在Python中创建异步套接字?

时间:2018-01-04 03:27:27

标签: python multithreading sockets asynchronous

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

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

这不是"异步",从某种意义上说,我必须使尽可能异步而不实际实现它。有没有正确的方法来做到这一点?或者说幕后的任何事情都和我一样完全一样吗?

我调查过的其他事情是解决这个问题的方法:

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

请注意:我正在接近这个作为学习练习,以更好地了解异步系统如何工作,而不是了解如何使用特定的库,所以请不要建议现有的库,除非它包含非常简单的代码理解并简明扼要地回答这个问题。

1 个答案:

答案 0 :(得分:1)

对于asyncio来说,这似乎是一个非常简单的用例。我不会考虑使用asyncio作为"使用特定的库"因为与asyncio的事件循环配对的套接字编程是相当低级的,如果你有其他语言的经验并且只想看看异步编程在Python中是如何工作的,那么这个概念是非常透明的。

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

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

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

我还建议大卫比兹利这个惊人的会议作为异步Python编程的必看之处。他使用套接字解释了Python中的并发概念,正是您所需要的:https://www.youtube.com/watch?v=MCs5OvhV9S4