2015-07-09 1 views
0

Я пытаюсь получить около 1000 подключений к моему серверу, но он не может получить больше 512. Что я могу сделать, чтобы увеличить количество открытых подключений? Я бегу окна 8.1слишком много дескрипторов файлов в select() python в windows

Не: Я новичок в этой вещи так, спасибо за помощь

Вот мой код;

import asyncore 
import socket 
import uuid 
import time 
import threading 

class statistics(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
    def run(self): 
     while True: 
      entry = raw_input("") 
      zaman = int(time.time()) 
      cmd = receivedCmd 
      print "calculating.." 
      time.sleep(1) 
      if entry == 'istatistik': 
       print str(receivedCmd-cmd) + " command/second" 
       print "total received commands: " + str(receivedCmd) 
       entry = "" 
class tcpClient: 
    def __init__(self): 
     self.clientid = uuid.uuid1(int(time.time())) 
     self.buffer = "" 
     self.buffer_size = 0 
     self.conn_time = time.time() 
     self.overflow = 0 
     #print str(self.clientid) + " assingned" 
    def recv_msg(self, msg): 
     global receivedCmd 
     self.buffer = msg 
     self.buffer_size = len(self.buffer) 
     receivedCmd = receivedCmd + 1 
     if self.buffer_size >= 1024: 
      self.overflow = 1 

    def __del__(self): 
     print str(self.clientid) + " has left." 


class TCPHandler(asyncore.dispatcher_with_send): 
    global clist 
    def handle_read(self): 
     data = self.recv(1024) 
     if data: 
      if clist[self].overflow: 
       self.send("overflow") 
       self.handle_close() 
      else: 
       self.send(data) 
       clist[self].recv_msg(data) 
    def handle_close(self): 
     del clist[self] 
     self.close() 

    def handle_error(self): 
     del clist[self] 
     self.close() 

class TCPServer(asyncore.dispatcher): 
    global clist 
    def __init__(self, host, port): 
     asyncore.dispatcher.__init__(self) 
     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.set_reuse_addr() 
     self.bind((host, port)) 
     self.listen(5) 

    def handle_accept(self): 
     self.clist = clist 
     pair = self.accept() 
     if pair is None: 
      pass 
     else: 
      sock, addr = pair 
      #print 'Connection : %s' % repr(addr) 
      clist[TCPHandler(sock)] = tcpClient() 

if __name__ == '__main__': 
    clist = {} 
    receivedCmd = 0 
    server = TCPServer('', 5000) 
    server2 = TCPServer('',5001) 

    StaticsThread = statistics() 
    StaticsThread.start() 
    asyncore.loop() 

Примечание: Я до сих пор не могу получить более 512 соединений с Twisted Framework, я не знаю, что делать. Должны быть тысячи подключенных клиентов. Пожалуйста помоги.

ответ

0

Модуль asyncore полагается на функцию ОС select, которая поддерживает только ограниченное число дескрипторов файлов.

В качестве альтернативы используйте многопоточный сервер (я не буду рекомендовать это) или, лучше, Twisted framework, который управляется событиями (рекомендуется!).

Надеюсь, это поможет!


Поскольку реактор Twisted по умолчанию под Windows также выбран на основе выбора, тогда вы должны использовать вместо этого реактор IOCP.

from twisted.internet import iocpreactor 
iocpreactor.install() 

from twisted.internet import reactor 

Но также принять во внимание, что Twisted предпочитает систему Linux (где реактор по умолчанию Epoll основы), а не Windows. Возможно, переключение на Linux - лучший выбор.

+0

Большое спасибо. Я буду смотреть в него. Я попробовал потоки, но потоки тоже ограничены – Tom

+0

Я попробовал, но скрученный фреймворк тоже не работал. все еще застрял в 512 соединениях :( – Tom

+0

@MertTumer См. обновленный ответ. – cdonts

Смежные вопросы