gpt4 book ai didi

python - Stackless python 网络性能随着时间的推移而下降?

转载 作者:太空狗 更新时间:2023-10-29 20:46:41 24 4
gpt4 key购买 nike

所以我正在玩弄无堆栈 python,编写一个非常简单 的网络服务器来自学使用微线程/tasklet 进行编程。但现在我的问题是,当我在 apache bench 中运行类似 ab -n 100000 -c 50 http://192.168.0.192/ (100k 请求,50 并发)的东西时,我得到类似 6k req/s,我第二次运行它时我得到 5.5k,第三次 5k,第四次,4.5k,等等,一直下降到 100req/s 或其他东西。

不过,当我重新启动 python 脚本时,问题就消失了。

现在我的问题是为什么?我忘记删除 tasklet 了吗?我已经检查了 stackless.getrunco​​unt()(出于某种原因,它似乎总是返回 1)所以似乎不会有任何死的 tasklets 徘徊?我试过在所有已完成的小任务上调用 .kill(),但没有帮助。我就是想不通这个。

import socket
import select
import stackless
import time

class socket_wrapper(object):
def __init__(self, sock, sockets):
super(socket_wrapper, self).__init__()
self.sock = sock
self.fileno = sock.fileno
self.sockets_list = sockets
self.channel = stackless.channel()
self.writable = False
self.error = False

def remove(self):
self.sock.close()
self.sockets_list.remove(self)

def send(self, data):
self.sock.send(data)

def push(self, bytes):
self.channel.send(self.sock.recv(bytes))

def stackless_accept(accept, handler, recv_size=1024, timeout=0):
sockets = [accept]

while True:
read, write, error = select.select(sockets, sockets, sockets, timeout)

for sock in read:
if sock is accept:
# Accept socket and create wrapper
sock = socket_wrapper(sock.accept()[0], sockets)

# Create tasklett for this connection
tasklet = stackless.tasklet(handler)
tasklet.setup(sock)

# Store socket
sockets.append(sock)

else:
# Send data to handler
sock.push(recv_size)

# Tag all writable sockets
for sock in write:
if sock is not accept:
sock.writable = True

# Tag all faulty sockets
for sock in error:
if sock is not accept:
sock.error = True
else:
pass # should do something here if the main socket is faulty

timeout = 0 if socket else 1
stackless.schedule()

def simple_handler(tsock):
data = ""

while data[-4:] != "\r\n\r\n":
data += tsock.channel.receive()

while not tsock.writable and not tsock.error:
stackless.schedule()

if not tsock.error:
tsock.send("HTTP/1.1 200 OK\r\nContent-length: 8\r\n\r\nHi there")
tsock.remove()

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("192.168.0.192", 8000))
sock.listen(5)

stackless.tasklet(stackless_accept)(sock, simple_handler)
stackless.run()

最佳答案

两件事。

首先,请让类名以大写字母开头。它更传统,更易于阅读。

更重要的是,在 stackless_accept 函数中,您积累了 Sock 对象的 list,名为 sockets。这份名单似乎在无休止地增长。是的,您有一个remove,但它并不总是被调用。如果套接字出现错误,那么它似乎将永远留在集合中。

关于python - Stackless python 网络性能随着时间的推移而下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/554805/

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