启动我的python脚本,通过套接字编程处理HTTP请求,CPU达到100%?

时间:2017-08-08 09:24:50

标签: python sockets http

我正在编写一个脚本来通过套接字编程来处理HTTP请求。我的Python脚本只读取每个HTTP响应,搜索几个关键字并递增计数器。

当没有传入消息时,仅启动脚本会使CPU达到90-99%。我应该怎么处理这个?



HOST = '' 
SOCKET_LIST = []
RECV_BUFFER = 40966 
PORT=int(sys.argv[1])
serviceInitiatedEvent=0
deliveredEvent=0
EstablishedEvent=0
ConnectionClearedEvent=0

def chat_server():

    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind((HOST, PORT))
    server_socket.listen(10)
 
    SOCKET_LIST.append(server_socket)
 
    print "Chat server started on port " + str(PORT)
  
    try:
     while 1:
	 
        ready_to_read,ready_to_write,in_error = select.select(SOCKET_LIST,[],[],0)
      
        for sock in ready_to_read:
            if sock == server_socket: 
                sockfd, addr = server_socket.accept()
                SOCKET_LIST.append(sockfd)
                 
            
            else:
                  try:
                    data = sock.recv(RECV_BUFFER)
                    if data:
     				if re.search('serviceInitiatedEvent></SOAP-ENV',data):
					global serviceInitiatedEvent
					serviceInitiatedEvent+=1
     				if re.search('deliveredEvent></SOAP-ENV',data):
					global deliveredEvent
					deliveredEvent+=1	

                    else:
 
                        if sock in SOCKET_LIST:
                            SOCKET_LIST.remove(sock)

                except:
                    broadcast(server_socket, sock, "Client (%s, %s) is offline\n" % addr)
                    continue
                    
    except KeyboardInterrupt:
                    print "service Initiated Event:%s" % (serviceInitiatedEvent)
                    print "delivered Event: %s" % (deliveredEvent)


    server_socket.close()
    

 
if __name__ == "__main__":

    sys.exit(chat_server())
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

如果你的代码while 1循环使用100%,那可能是罪魁祸首。它被称为busy waiting

select函数有timeout参数,用于指定等待事件的时间。在您的代码中,您将其设置为0,以便当套接字中没有可用数据时,控制立即返回,从而导致忙等待循环。

根据您的需要指定一些较大的超时,以便您的代码在没有任何操作时不会旋转:

ready_to_read,ready_to_write,in_error = select.select(SOCKET_LIST,[],[], 1)
#                                                                       ^^^ here
相关问题