gpt4 book ai didi

python - 我惊呆了 : weird problem with python and sockets + threads

转载 作者:行者123 更新时间:2023-11-28 19:52:13 25 4
gpt4 key购买 nike

我有一个 python 脚本,它是一个 http 服务器:http://paste2.org/p/89701 ,当使用低于或等于我在源代码中的 socket.listen() 调用中指定的值的并发级别(-c 开关)对 ApacheBench (ab) 进行基准测试时,一切正常,但只要把apache bench 中的并发级别高于 socket.listen() 中的值 - 调用性能下降,一些示例:

两次调用之间的代码没有任何变化,我无法弄清楚哪里出了问题 - 这个问题已经解决一天了。另请注意:无论 socket.listen() 设置为什么或 apache 中的并发性(-c 开关)设置为什么,相同代码的多路复用版本(我写来与线程版本进行比较)都可以正常工作。

我花了一天时间查看 IRC/python 文档,发布在 comp.lang.python 和我的博客上 - 我找不到任何人甚至知道可能出了什么问题。帮帮我!

最佳答案

我无法确认您的结果,并且您的服务器编码可疑。我启动了自己的服务器,也没有这个问题。让我们将讨论转移到更简单的层面:

import thread, socket, Queue

connections = Queue.Queue()
num_threads = 10
backlog = 10

def request():
while 1:
conn = connections.get()
data = ''
while '\r\n\r\n' not in data:
data += conn.recv(4048)
conn.sendall('HTTP/1.1 200 OK\r\n\r\nHello World')
conn.close()

if __name__ == '__main__':
for _ in range(num_threads):
thread.start_new_thread(request, ())

acceptor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
acceptor.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
acceptor.bind(('', 1234))
acceptor.listen(backlog)
while 1:
conn, addr = acceptor.accept()
connections.put(conn)

在我的机器上是这样的:

ab -n 10000 -c 10 http://127.0.0.1:1234/ --> 8695.03 [#/sec]
ab -n 10000 -c 11 http://127.0.0.1:1234/ --> 8529.41 [#/sec]

关于python - 我惊呆了 : weird problem with python and sockets + threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/219547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com