基本问题:我需要听一个流,并且每隔一定间隔(当从流中收到特定信息时)我想运行一个单独的函数,但仍然继续听。我知道一种方法是使用Threads,其中一个线程侦听,另一个执行动作。我已经修改了一个在线检查表来做到这一点,但是它只调用一次“ act”功能,而不是每次都设置该事件。有没有一种方法可以基于“流”线程中的事件来调用“行为”函数? (注意,下面没有实际的流,只是一个循环。需要简化此问题。下面的事件是当j等于3、6、9时)
def act(e):
logging.debug('Initiated - waiting...')
event_is_set = e.wait()
if event_is_set:
logging.debug('Event is set, creates CS')
e.clear()
def stream(e):
for j in range(10):
logging.debug('j: {}'.format(j))
if j in [3, 6, 9]:
e.set()
logging.debug('Event: {}'.format(e.isSet()))
e = threading.Event()
t1 = threading.Thread(name='block', target=act, args=(e,))
t1.start()
t2 = threading.Thread(name='non-block', target=stream, args=(e,))
t2.start()
输出:
(block) Initiated - waiting...
(non-block) j: 0
(non-block) Event: False
(non-block) j: 1
(non-block) Event: False
(non-block) j: 2
(non-block) Event: False
(non-block) j: 3
(non-block) Event: True
(block) Event is set, creates CS
(non-block) j: 4
(non-block) Event: False
(non-block) j: 5
(non-block) Event: False
(non-block) j: 6
(non-block) Event: True
(non-block) j: 7
(non-block) Event: True
(non-block) j: 8
(non-block) Event: True
(non-block) j: 9
(non-block) Event: True
当事件为true时,当j = 3时调用“ act”函数,但对于j = 6或j = 9则不调用。我显然犯了一个错误,但是我需要做/更改什么才能获得该功能?
答案 0 :(得分:0)
这是因为act
线程已完成。
如果在用例中,您恰好在等待三个事件,那么在act函数中需要一个loop
,它将等待三次事件。如果您想让它永远监听,那么在使用流线程时,您需要一个无限循环和一种杀死线程的机制。
#if you are expecting exactly 3 events.
def act(e):
for i in range(3):
logging.debug(f'Initiated - waiting for event {i}')
event_is_set = e.wait()
if event_is_set:
logging.debug('Event is set, creates CS')
e.clear()