Recentemente ho letto this document che elenca un numero di strategie che potrebbero essere utilizzate per implementare un server socket. Vale a dire, essi sono:Scrittura di un server basato su socket in Python, strategie consigliate?
- servire molti clienti con ogni thread, e utilizzare non bloccante di I/O e la notifica prontezza livello-innescato
- servire molti clienti con ogni thread, e utilizzare non bloccante di I/O e la prontezza di notifica di modifica
- servire molti clienti con ogni thread del server e utilizzare I/O asincrono
- servire un cliente con ogni thread del server e utilizzare il blocco di I/O
- costruire il codice del server nel kernel
Ora, gradirei un suggerimento su cui dovrebbe essere utilizzato in CPython, che sappiamo ha alcuni punti positivi e alcuni punti negativi. Sono principalmente interessato alle prestazioni in concorrenza elevata, e sì, alcune delle implementazioni attuali sono troppo lente.
Quindi, se posso iniziare con quello facile, "5" è fuori, dato che non ho intenzione di hackerare qualcosa nel kernel.
"4" Sembra che debba uscire per via del GIL. Ovviamente, qui puoi usare il multiprocessing al posto dei thread, e questo dà un notevole impulso. Anche il blocco dell'IO ha il vantaggio di essere più facile da capire.
E qui la mia conoscenza diminuisce un po ':
"1" è tradizione selezionare o sondaggio che potrebbe essere banalmente combinato con multiprocessing.
"2" è la notifica di disponibilità cambio, utilizzato dal epoll più recente e kqueue
"3" Non sono sicuro che ci sono tutte le implementazioni del kernel per questo che hanno wrapper Python.
Quindi, in Python abbiamo una borsa di grandi strumenti come Twisted. Forse sono un approccio migliore, anche se ho messo a confronto Twisted e l'ho trovato troppo lento su una macchina con più processori. Forse avere 4 twisted con un load balancer potrebbe farlo, non lo so. Tutto il consiglio sarebbe apprezzato.
Penso che epoll sia nello stdlib in 2.6+ e easy_installable per 2.5. Il pacchetto si chiama select-something. Mi dispiace per la vaghezza. –
Twisted può anche usare epoll. In effetti, Twisted trasforma tutte le API di notifica eventi supportate in un'API uniforme che presenta all'utente. Quindi, se il meglio che la piattaforma può fare è selezionare, la tua app utilizza select. Se ha epoll, la tua app utilizza epoll. Tutto in modo trasparente per te. –
È scritto 'asyncore' – new123456