0
votes

Comment empêcher un programme d'attendre de recevoir un message du client?

Je créais un système de discussion dans lequel le programme tentera de recevoir un message de chaque client en ligne, mais le problème est que le programme attend que le premier client envoie quelque chose et reçoive, puis elle écoute une autre. Veuillez consulter le code ci-dessous, j'ai simplifié le code sans fournir le principal.

import socket
port = input("Port: ")
s = socket.socket()
s.bind(('', port))
s.listen(5)
a, b = s.accept()
print "Connection", "with", b[0], "Created Successfully"
while True:
    try:
        rec = a.recv(1024)
        print rec
    except:
        print "Time Out"


2 commentaires

Vous souhaitez utiliser le Sondage (2) appel système.


Ce que vous faites actuellement s'appelle un appel de blocage pour recevoir les octets, ce que vous voulez faire est un appel non bloquant pour recevoir les données (et transmettre un rappel pour effectuer des mises à jour) afin que votre fil principal ne gèle pas.


4 Réponses :


-1
votes

Votre question est spécifique au système d'exploitation.

Utiliser le Sélectionnez et sondage - En attente de l'achèvement d'E / S Opérations . Et probablement le Selectors module. Ou trouver des boucle d'événement module.

Vous voudrez peut-être lire alp pour comprendre comment utiliser Linux Appels système (répertoriés dans syscalls (2) ; lisez sur sondage (2) )

Vous pouvez lire Système d'exploitation: trois pièces faciles < / a> comprendre plus sur les OSES.


0 commentaires

1
votes

visitez https://docs.python.org/2/ Bibliothèque / socket.html # Socket-Objects Ceci est pour la prise PYTHON2.7

socket.setBlocking (drapeau) Définissez le bloc de blocage ou de blocage de la prise: Si le drapeau est 0, la prise est réglée sur le mode de blocage non bloquant. Initialement, toutes les sockets sont en mode blocage. En mode non bloquant, si un appel RECV () ne trouve aucune donnée ou si un appel d'envoi () ne peut pas immédiatement disposer des données, une exception d'erreur est soulevée; En mode blocage, le bloc d'appels jusqu'à ce qu'ils puissent procéder. s.setblocking (0) équivaut à S.Settimeout (0,0); s.setblocking (1) équivaut à s.settimeout (aucun).

socket.settimeout (valeur) Définissez un délai d'attente sur les opérations de prise de blocage. L'argument de valeur peut être un flotteur non négatif exprimant des secondes ou aucune. Si un float est donné, les opérations de socket ultérieures augmenteront une exception de délai d'attente si la valeur de la période de délai est écoulée avant la fin de l'opération. La définition d'un délai d'attente de non ne désactive les délais d'attente sur les opérations de socket. S.Settimeout (0.0) équivaut à s.setblocking (0); S.Settimeout (aucun) est équivalent à S.Seblocking (1).


0 commentaires

1
votes

Programmation multi-thread: vous devez exécuter votre fonction d'écoute par un fil.


0 commentaires

0
votes

Il existe un certain nombre d'options dans Python. Juste pour nommer deux, https://twistedmatrix.com/ et https://docs.python.org/3/library/asyncio.html


0 commentaires