python socket listener高负载

时间:2013-12-02 13:25:09

标签: python sockets

我有一个线程化的Python监听器,用于读取,验证数据并将其写入文件。

到目前为止,我仅限于处理20个并发连接,但现在我需要它来处理更多,数百......可能是1000。

数据交换是客户端和服务器之间的一系列读写操作: 你好,用户名,密码,类别,多行文字,再见

每次手术之间有1秒睡眠。

这是一个示例代码,用于显示其设计方式。

  def handler(csock, caddr):
    while 1:
      # read hello
      # send welcome

      # read username
      # send true/false

      # read password
      # send true/false

      # read payload
      # send true/false

      # read bye
      # send bye

      # close connection
      # write data to file

      # Example how read and send are done
      inc = csock.recv(1024)
      csock.send(out)

  serversocket = socket(AF_INET, SOCK_STREAM)
  serversocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
  serversocket.bind(('', 50005))
  serversocket.listen(20)

  while 1:
    csock, caddr = serversocket.accept()
    threading.Thread(target=handler, args=(csock, caddr,)).start()

我的问题:

Python能够在没有问题的情况下运行多达1000个并发连接吗?

如果我的代码设计足够坚固吗?

2 个答案:

答案 0 :(得分:0)

这里没有很多信息。有用的知识是传入文本的平均预期大小。可能有一个几行文本文件仍然只有1 KB,这意味着您的计算机在任何给定时间必须处理的最大值仍然低于1 MB。我认为,平均互联网速度,你可以处理多达30行文本文件,然后才开始变得非常滞后。您可以通过测量每个步骤完成所需的时间来补偿这种滞后,然后从time.sleep中减去该延迟。根据我的计算,通过快速的互联网速度,您一次可以处理至少70行。你打算加密用户名和密码吗?

答案 1 :(得分:0)

Python线程被称为Global Interpreter Lock的东西锁定。这意味着python解释器生成的任何线程都仍然在一个main线程下运行。它们不能是多线程的(至少不是在vanilla python中)。因此,在您的情况下,当您为每个连接生成一个线程时,它们仍然按顺序运行。

一种解决方法是python的multiprocessing模块。

Python还有一些default modules来帮助您完成任务。

^^^这些直接映射到您为每个客户分配线程/进程的想法。

还要考虑查看第三方python库twisted

如果在linux上(我认为它也映射到windows / mac),请考虑在python中查找select语句。它(基本上)检查大量连接并返回具有等待输入/输出的连接。