Вот моя проблема: у меня есть 2 программы, общающиеся благодаря zmq через произвольный порт tcp. Когда # 1 получает сообщение от # 2, он должен вызвать какую-то функцию. Если # 1 получает сообщение до завершения текущей функции, я бы хотел # 1 прервать текущую функцию и вызвать новую. Я пытался использовать threading.Event, чтобы прервать функцию. Я не знаю, подходит ли zmq для моих нужд или подходит ли сокет.
Чтобы упростить, я покажу простейшую возможную версию, вот что я попробовал: p1.py
import zmq
from threading import Event
port_p2 = "6655"
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.connect("tcp://localhost:%s" % port_p2)
print("port 6655")
__exit1 = Event()
__exit2 = Event()
def action1():
__exit1.clear()
__exit2.set()
while not __exit1.is_set():
for i in range(1, 20):
print(i)
time.sleep(1)
__exit1.set()
def action2():
__exit2.clear()
__exit1.set()
while not __exit2.is_set():
for i in range(1, 20):
print(i * 100)
time.sleep(1)
__exit2.set()
if __name__ == "__main__":
try:
while True:
try:
string = socket.recv(flags=zmq.NOBLOCK)
# message received, process it
string = str(string, 'utf-8')
if "Action1" in string:
action1()
if "Action2" in string:
action2()
except zmq.Again as e:
# No messages waiting to be processed
pass
time.sleep(0.1)
except(KeyboardInterrupt, SystemExit):
print("exit")
и p2.py
import time
import random
port_p1 = "6655"
context = zmq.Context()
socket_p1 = context.socket(zmq.PAIR)
socket_p1.bind("tcp://*:%s" % port_p1)
print("port 6655")
if __name__ == "__main__":
while True:
i = random.choice(range(1, 10))
print(i)
try:
if random.choice([True, False]):
print("Action 1")
socket_p1.send(b'Action1')
else:
socket_p1.send(b'Action2')
print("Action 2")
except zmq.Again as e:
pass
time.sleep(i)
Для своих целей я не хотел / не могу использовать системные сигналы
Буду признателен за любой ввод и не стесняюсь просить точности, я должен признаться, что мне было трудно записать это. Спасибо