我有這個應用程式可以跨多個設備共享作業并在它們上啟動行程,它們通常需要相互同步。
- Web 應用程式打開與服務器的 SSH 連接。
- 它為每個服務器啟動n 個Python 實體。
- 然后關閉 SSH 連接。
之后,每個代理通信的唯一方式是使用 MQTT(發布/訂閱主題)。我使用的 MQTT 庫是 Paho-MQTT。
我目前的問題是我找不到讓他們等待的好方法。我覺得while true : sleep這不是一個好方法,但我不知道如何做得更好。
我當前的代碼如下所示:
def wake_up(self, client, userdata, message) -> None:
self.wake_up_token = 1
def wait(self) -> None:
while self.wake_up_token == 0:
sleep(self.wait_delay)
self.wake_up_token -= 1
到目前為止,我唯一的想法是通過二分法找到最佳的等待延遲,但這會很耗時,所以我希望有更好的解決方案。
筆記:
def wait():
while self.wake_up_token == 0:
pass
這是一個糟糕的解決方案,因為該程序將不斷競爭以檢查條件,并且它會使系統慢數千倍。
我猜最小的例子:(1個代理,1個調度程式)
from paho.mqtt.client import Client
from time import sleep
class Agent:
def __init__(self, broker_ip: str, client_id: str):
self.client: Client = Client(client_id=client_id)
self.client.username_pw_set(username="something", password="veryverysecured")
self.client.connect(host=broker_ip)
self.client.subscribe("wake_up_topic")
self.client.message_callback_add("wake_up_topic", self.wake_up)
self.client.loop_start()
self.wake_up_token = 0
def wake_up(self, client, userdata, message) -> None:
self.wake_up_token = 1
def wait(self) -> None:
while self.wake_up_token == 0:
sleep(self.wait_delay)
self.wake_up_token -= 1
def run(self):
while True:
# do something
self.client.publish(topic="agent/action_done", message="")
self.wait()
# do something
class Scheduler:
def __init__(self, broker_ip: str):
self.client: Client = Client(client_id="scheduler")
self.client.username_pw_set(username="something", password="veryverysecured")
self.client.connect(host=broker_ip)
self.client.subscribe("agent/action_done")
self.client.message_callback_add("agent/action_done", self.wake_up)
self.client.loop_start()
self.wake_up_token = 0
def wake_up(self, client, userdata, message) -> None:
self.wake_up_token = 1
def wait(self) -> None:
while self.wake_up_token == 0:
sleep(self.wait_delay)
self.wake_up_token -= 1
def run(self):
while True:
#agents are doing their thing
self.wait()
self.client.publish(topic="wake_up_topic", message="")
我不知道它是否有用,但整個專案的目標是構建一個跨多個服務器共享代理的MAS框架。
uj5u.com熱心網友回復:
我認為標準信號量在這種情況下最有用。我無法對此進行測驗,因為我沒有運行 MQTT 客戶端/服務器,但它應該是這樣的:
import threading
class Scheduler:
def __init__(self, broker_ip: str):
# your init code here (unchanged), but add this line:
self.semaphore = threading.Semaphore(0)
def wake_up(self, client, userdata, message) -> None:
self.semaphore.release()
def wait(self) -> None:
self.semaphore.acquire()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/478070.html
