使用RxPy时rx.timer与rx.interval执行无输出是什么原因
问题原因
RxPy v3.x版本中,rx.timer、rx.interval这类时间相关的操作符默认运行在异步调度器上,回调执行逻辑都在后台线程。你的代码中没有做任何阻塞主线程的操作,主线程跑完所有同步代码后会直接退出,后台的定时任务还没来得及触发回调就被销毁了,因此看不到预期输出。
解决方案
你可以根据使用场景选择以下任意一种方案:
- 临时测试场景:直接在代码末尾加足够长的阻塞等待逻辑,让定时任务有执行窗口
import time # 原有代码放在此处 # ... # 阻塞10秒,期间所有定时任务会正常触发 time.sleep(10)
- 生产场景更规范的RxPY原生实现:使用调度器的
run()方法阻塞主线程,直到所有任务执行完成或手动终止
import rx from rx.scheduler import ThreadPoolScheduler custom_scheduler = ThreadPoolScheduler() # 订阅时指定调度器 rx.interval(1.0, scheduler=custom_scheduler).subscribe( on_next=lambda i: print("tick {}".format(i)), on_error=lambda e: print("error: {}".format(e)), on_completed=lambda: print("completed") ) # 阻塞主线程,直到调度器任务全部结束 custom_scheduler.run()
- 如果不需要无限执行定时任务,可以搭配
take等操作符限定发射次数,发射完成后程序会自动退出。
内容的提问来源于stack exchange,提问作者Wiep Nijdam
相关产品推荐
相关产品推荐

