fix endless loop

This commit is contained in:
callebtc 2023-04-17 15:47:03 +02:00
parent 37b48b7c0c
commit 33df69c73a
5 changed files with 45 additions and 14 deletions

View file

@ -141,7 +141,7 @@ class NostrClient:
if callback_events_func:
callback_events_func(event_msg)
while self.relay_manager.message_pool.has_notices():
event_msg = self.relay_manager.message_pool.has_notices()
event_msg = self.relay_manager.message_pool.get_notice()
if callback_notices_func:
callback_notices_func(event_msg)
while self.relay_manager.message_pool.has_eose_notices():

View file

@ -33,6 +33,7 @@ class Relay:
self.subscriptions = subscriptions
self.connected: bool = False
self.reconnect: bool = True
self.shutdown: bool = False
self.error_counter: int = 0
self.error_threshold: int = 0
self.num_received_events: int = 0
@ -66,6 +67,7 @@ class Relay:
def close(self):
self.ws.close()
self.shutdown = True
def check_reconnect(self):
try:
@ -85,12 +87,16 @@ class Relay:
def publish(self, message: str):
self.queue.put(message)
def queue_worker(self):
def queue_worker(self, shutdown):
while True:
if self.connected:
message = self.queue.get()
self.num_sent_events += 1
self.ws.send(message)
try:
message = self.queue.get(timeout=1)
self.num_sent_events += 1
self.ws.send(message)
except:
if shutdown():
break
else:
time.sleep(0.1)

View file

@ -15,6 +15,8 @@ class RelayException(Exception):
class RelayManager:
def __init__(self) -> None:
self.relays: dict[str, Relay] = {}
self.threads: dict[str, threading.Thread] = {}
self.queue_threads: dict[str, threading.Thread] = {}
self.message_pool = MessagePool()
def add_relay(
@ -25,7 +27,10 @@ class RelayManager:
self.relays[url] = relay
def remove_relay(self, url: str):
self.relays[url].close()
self.relays.pop(url)
self.threads[url].join(timeout=1)
self.threads.pop(url)
def add_subscription(self, id: str, filters: Filters):
for relay in self.relays.values():
@ -37,16 +42,21 @@ class RelayManager:
def open_connections(self, ssl_options: dict = None, proxy: dict = None):
for relay in self.relays.values():
threading.Thread(
self.threads[relay.url] = threading.Thread(
target=relay.connect,
args=(ssl_options, proxy),
name=f"{relay.url}-thread",
daemon=True,
).start()
)
self.threads[relay.url].start()
threading.Thread(
target=relay.queue_worker, name=f"{relay.url}-queue", daemon=True
).start()
self.queue_threads[relay.url] = threading.Thread(
target=relay.queue_worker,
args=(lambda: relay.shutdown,),
name=f"{relay.url}-queue",
daemon=True,
)
self.queue_threads[relay.url].start()
def close_connections(self):
for relay in self.relays.values():