首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有堆栈的python网络性能会随着时间的推移而下降?

没有堆栈的python网络性能会随着时间的推移而下降?
EN

Stack Overflow用户
提问于 2009-02-16 22:16:06
回答 1查看 1.6K关注 0票数 8

所以我在玩没有堆栈的python,编写一个非常简单的very服务器来教自己用微线程/tasklet编程。但是现在我的问题是,当我在apache上运行类似ab -n 100000 -c 50 http://192.168.0.192/ (100 k请求,50并发)的东西时,我得到了6k req/s这样的东西,第二次运行它时,我得到了5.5k,第三次,第四次,4.5k等等,直到100 req/s或其他东西。

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

现在我的问题是为什么?我忘了删除任务了吗?我已经检查了stackless.getruncount() (由于某种原因,它似乎总是返回1 ),所以似乎不会出现任何挂起的线程吗?我尝试过在所有已完成的任务上调用.kill(),但都没有帮助。我就是搞不懂这件事。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-02-16 22:52:41

两件事。

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

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

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/554805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档