多线程-在另一个线程中被多次调用的功能

时间:2019-11-26 12:51:48

标签: python multithreading

基本问题:我需要听一个流,并且每隔一定间隔(当从流中收到特定信息时)我想运行一个单独的函数,但仍然继续听。我知道一种方法是使用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则不调用。我显然犯了一个错误,但是我需要做/更改什么才能获得该功能?

1 个答案:

答案 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()