je code suivant, serveur accepter la connexion réseau, le transmettre à l'enfant à traiter avec Manager().Queue()
:processus serveur a commencé par multiprocessing.Manager() rend la prise fermée immédiatement canalisée pas
q = Manager().Queue()
class Server:
def run(self, host, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
print('parent', os.getpid())
while True:
c, _ = s.accept()
q.put(c)
c.close()
def handle_request():
print('child', os.getpid())
while True:
c = q.get()
time.sleep(1)
print(c.recv(4))
c.close()
Process(target=handle_request, args=()).start()
Server().run('127.0.0.1', 10000)
close
ne fonctionne pas attendu, je pense que c'est parce que le processus de serveur de Manager
ont une référence sur ce socket, lsof -i
confirmé. Comment faire face à cela? J'ai trouvé il n'y a pas un moyen de fermer la socket dans Manager
processus, shutdown
pourrait faire l'affaire mais pas ce que je veux.
Ce que je peux voir, c'est que Server.run ferme le socket juste après l'avoir placé dans une file d'attente. Donc, cette socket est la file d'attente est fermée à partir de là. – ForceBru
@ForceBru non, l'enfant pourrait l'utiliser normalement. –
Quelle est votre question? Pourquoi y a-t-il un autre processus? Ou pourquoi la prise ne se ferme pas? Et que voulez-vous dire par "ne ferme pas"? – bnaecker