2011-09-19 43 views
2

我想弄清楚如何让一台服务器可以同时接受多个客户端。在这样做的时候,我需要客户端能够同时发送和接收来自服务器的数据。同时发送/接收来自服务器的信息,在Python中?

我需要制作一个线程服务器吗?并有一个线程来监听数据。

然后再发送信息给客户端的另一个线程?

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

回答

3

使用异步IO。 python有十几个异步IO套接字库。 Here是一个简短的基准。我还测试了gevent,eventlet,asyncore,twisted,pyev,pycurl,tornado

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

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

2

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

一旦建立连接,客户端和被实例化的通信线程需要额外的线程,如果他们需要做的其他业务并行比听插座如果通信是同步的。如果您需要异步通信,那么Python提供了非常好的Asynchronous Socket Handler

+0

那么线程不需要,然后在异步服务器上? –

+0

这是绝对需要的。但是,它可以封装在一个库或框架中,例如Socket Server,这样就不需要直接处理线程对象。 – Santa

+0

我会将Socket服务器导入异步?然后,我会从Socket服务器上使用什么? –

1

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

1

对于客户端或服务器都不需要线程;您可以改为选择()来复用单个线程内的所有I/O。

相关问题