Python: Sockel und Fäden?

Ich habe ein Design-Problem:

Ich habe zwei Threads, einen Heartbeat / Control Thread und einen Messagehandler Thread.

Beide teilen sich die gleiche Sockel, aber der MessageHandler-Thread sendet nur Nachrichten aus und erhält niemals. Der Heartbeat-Thread sendet und empfängt (empfängt Nachrichten und reagiert auf Heartbeats).

Das Problem ist, ich bin mir nicht sicher, ob das sicher ist. Es gibt keinen Mechanismus, ich selbst, um zu sehen, ob die Steckdose verwendet wird. So teilen Sie eine Steckdose über Python automatisch Thread sicher oder nicht?

Auch wenn es nicht ist, der Grund, warum ich sie in einen separaten Thread gelegt habe, ist, weil der Herzschlag wichtiger ist als die Nachrichtenbehandlung. Dies bedeutet, dass, wenn es mit Nachrichten überschwemmt wird, muss es immer noch einen Herzschlag machen. Also, wenn ich einen Bolzen implementieren muss, ist da weg kann ich priorisieren wenn mein Herzschlag / Kontroll-Thread einen Herzschlag schicken muss?

4 Solutions collect form web for “Python: Sockel und Fäden?”

Leider ist die Socket, die von Multi-Thread geteilt wird, nicht Thread safe.Think über Puffer zwei Threads betreiben ohne Sperre.

Der normale Weg zu implementieren ist mit zwei Sockel, genau wie was ftp does.cmd Sockel und msg Sockel.

Wenn du das um einen Sockel implementieren möchtest, kannst du verschiedene Typs msgs in verschiedene Warteschlangen stellen und mit einem dritten Thread die Warteschlange verbrauchen und sie durch den einzigen Sockel senden.

Auf diese Weise können Sie Herzschlag msg priory auf Daten msg steuern.

Ein besserer Weg, anstatt einen dritten Thread zu verwenden, ist, threading.Lock() zu verwenden, um die Socket-Ressource zu schützen, da dies die Notwendigkeit eines dritten Threads beseitigt. Sie haben einen niedrigeren Overhead und weniger Latenz, als wenn Sie einen dritten Thread hatten.

 import threading lock = threading.Lock() def sendfunction(sock, data): with lock: sock.send(data) 

Sie können das von einem Ihrer Threads anrufen, aber nur ein Thread zu einer Zeit darf sock.send . Wenn ein Thread die Sperre erreicht, die bereits durch einen anderen Thread gesperrt ist, wird er schlafen, bis der andere Thread die Sperre freigibt, dann erlangt er die Sperre und der Prozess wiederholt sich.

Das Threading-Modul enthält Lock , RLock und Condition die alle sehr nützlich sind, wenn es um mehrere Threads geht und Sie finden es sich lohnt sich, sich mit ihnen und ihrem Gebrauch vertraut zu machen.

Sie können den Herzschlag in Ihre Nachrichtenbehandlung einbinden, indem Sie die aktuelle Zeit mit dem letzten Mal, wenn Sie einen Herzschlag gesendet haben, bevor Sie jede Nachricht verarbeiten, und das würde verhindern, dass mit Nachrichten überschwemmt, die einen Herzschlag nicht gesendet werden. Das Problem ist, wenn Ihre Nachricht Handhabung Code nicht läuft dann keine Herzschläge werden gesendet werden. Sie könnten dies zu lindern, indem Sie Ihre Nachricht Handhabung Code erhalten eine Dummy-Nachricht auf Intervall, damit es zu überprüfen, ob es braucht, um einen Herzschlag zu senden und einfach ignorieren die Dummy-Nachricht.

Du solltest versuchen, Threads sparsam zu verwenden (zielen auf einen einzelnen Thread) aber in deinem Fall wäre ein Thread wahrscheinlich in Ordnung, da es die meiste Zeit damit verbringen wird, zu schlafen. Du solltest aber keinen Daemon-Thread verwenden, weil sie nicht ordnungsgemäß heruntergefahren werden. Obwohl der Schaden in Ihrem Fall nicht vorhanden wäre, wenn es nicht ordnungsgemäß heruntergefahren wurde, könnte es immer noch eine Art von Fehler (Fehlermeldung), die schlecht aussieht, werfen.

Ich bin nicht einverstanden mit der Multi-Sockets-Methode, wie ich denke, es würde tatsächlich komplizieren die Situation. Hier finden Sie viele Arten von Netzwerkdiensten / -anwendungen, die den Herzschlag und die Nachrichten in einen einzigen Socket-Byte-Stream integrieren.

Ich weiß nicht von einer Möglichkeit, auf der Python-Ebene zu priorisieren.

So würde ich vorschlagen, mit 2 Prozessen, nicht Threads und Priorisierung auf OS-Ebene. Auf Unix kannst du os.nice () verwenden, um das zu tun.

Sie müssten dann 2 Sockets verwenden, und Ihr Sharing-Problem würde zur gleichen Zeit gelöst werden.

Wenn beide Threads Client-Threads sind, ist es eine gute Idee, zwei Client-Sockets zu öffnen, um einen Server für Herzschlag und einen anderen für die Kommunikation.

  • Python-Socket-Client und Server
  • Können pygame-Events in select.select-Eingabeliste behandelt werden?
  • Nachrichtenwiederherstellung / Socket-Kommunikation
  • Python icmp Socket Server (nicht tcp \ udp)
  • Python Socket Mehrere Clients
  • Python Socket Flush
  • Socket-Fehler [Errno 9] Schlechter Dateideskriptor HTTP-Server
  • Python-Socket-Verbindungszeitüberschreitung
  • Was ist der richtige Weg, um eine Steckdose in Python 2.6 zu schließen?
  • Fileno auf Klasse erstellen?
  • Wie kann ich eine Stoppuhr in meinem Sockel Python Programm implementieren
  • Python ist die beste Programmiersprache der Welt.