我有一个线程化的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个并发连接吗?
如果我的代码设计足够坚固吗?
答案 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
语句。它(基本上)检查大量连接并返回具有等待输入/输出的连接。