Comment mettre en œuvre non bloquant socket serveur en python

Un semblable, mais autre question:

J'ai un client IRC qui génère des chaînes de caractères. Ce client IRC utilise un crochet pour appeler une méthode (somone_said) à chaque fois que quelqu'un dit quelque chose. Je veux envoyer cette chaîne sur un socket à mon client flash.

J'ai un client de travail dans flash et un serveur en python, mais le problème est qu'il bloque:
1) lors de l'écoute de la connexion du client
2) lors de l'attente pour le prochain message généré

Cela empêche le client IRC à partir de répondre à d'autres entrées.

Je pense que j'ai besoin de créer ma prise dans un thread séparé, mais cela crée des trois plus de problèmes.
1) comment est-ce que mon someone_said événement piloté par la méthode d'accès à la socket
2) Que faire si quelqu'un dit quelque chose quand il n'y a pas de serveur de connexion du client (pendant l'écoute) ou si le client a fermé la connexion.
3) Comment faire pour vérifier si le thread est en vie et si ce n'est pour en ouvrir un nouveau?

Mon blocage code du serveur est: est-ce

# Echo server program
import socket
import sys

HOST = None               # Symbolic name meaning all available interfaces
PORT = 7001              # Arbitrary non-privileged port
s = None

def startListening():
    print "starting to listen"

    for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                                  socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
        af, socktype, proto, canonname, sa = res
        try:
            s = socket.socket(af, socktype, proto)
        except socket.error as msg:
            s = None
            continue
        try:
            s.bind(sa)
            s.listen(1)
        except socket.error as msg:
            s.close()
            s = None
            continue
        break
    if s is None:
        print 'could not open socket'
        sys.exit(1)
    conn, addr = s.accept()
    print 'Connected by', addr
    while 1:
        try: 
            data = conn.recv(1024)
        except:
            print "cannot recieve data"
            break
        if not data: 
            break
        print data
        message = ""
        while not "quit" in message:
            message = raw_input('Say Something : ') # This will come from event driven method
            try: 
                conn.sendall(message)
            except Exception as exc:
                print "message could not be sent"
                break


    conn.close()
    print "connection closed"

while 1:
    startListening()

La xchat module python script fonctionne comme ceci (nécessite HexChat à exécuter)

__module_name__ = "Forward Module"
__module_version__ = "1.0.0"
__module_description__ = "Forward To Flash Module by Xcom"

import sys
import xchat

def someone_said(word, word_eol, userdata):
    # method called whenever someone speaks in IRC channel
    username = str(word[0]) # From IRC contains the username string
    message = str(word[1]) # From IRC contains the user message
    sendString = username + " : " + message
    send_to_server(sendString)


def send_to_server(message):
    # send over socket method to be implemented here

xchat.hook_print('Channel Message' , someone_said)

J'ai été frapper ma tête contre ce mur pendant des jours maintenant. M'aider à obi wan kenobi, vous êtes mon seul espoir.

OriginalL'auteur Zac | 2013-06-04