同时从服务器发送/接收信息,在python中?

时间:2011-09-19 19:15:56

标签: python multithreading sockets tcp

我正在试图弄清楚如何制作一次可以接受多个客户端的服务器。在这样做时,我需要客户端能够同时从服务器发送和接收数据。

我是否必须制作线程服务器?并有一个监听数据的线程。

然后是另一个向客户发送信息的线程?

那么对于客户端,我是否需要使用线程来发送/获取信息?

4 个答案:

答案 0 :(得分:3)

使用异步IO。 python有十几个异步IO套接字库。 Here是一个简短的基准。 我还测试了geventeventletasyncoretwistedpyevpycurltornado

  • Twsited
    虽然稳定,但速度最慢,也不容易入手。
  • gevent,eventlet(libevent)
    易于启动和快速(代码看起来像阻塞)但有一些分叉问题。
  • pycurl(libcurl)
    快速而简单(如果你可以做标志魔术..但有例子)但只有http。
  • pyev(libev)
    你必须明白自己在做什么,就像自己投票一样。
  • 龙卷风(在python中投票)
    足够快,我认为稳定且易于启动。
  • asyncore
    真的很快......但是不要用它..它是丑陋的。

除非你真的知道自己在做什么,否则不要在python中使用线程。 Python和线程不是真正的大朋友(除非版本< 3.2 in 3.2必须有新的gil)。

答案 1 :(得分:2)

在服务器端,您显然需要Socket Server。此服务器为每个传入的客户端连接创建一个新线程。

一旦建立连接,如果通信是同步的,则客户端和为通信实例化的线程如果必须并行执行其他业务而不是监听套接字,则需要额外的线程。如果您需要异步通信,那么Python提供了一个很好的Asynchronous Socket Handler

答案 2 :(得分:1)

使用异步套接字。可以找到示例服务器here和客户端代码here。线程没有直接的麻烦。根据您的需要,您可能不需要异步客户端。

答案 3 :(得分:1)

您不需要客户端或服务器的线程;你可以选择()来复用单个线程中的所有I / O.