阻塞事件循环

下面是一个简单的例子,演示在异步程序中调用阻塞函数如何阻塞事件循环

 

解释:

 

blocking_function:这是一个简单的阻塞函数,它调用 time.sleep(5) 来模拟一个长时间运行的操作。这是一个同步操作,会阻塞当前线程

  事件循环的阻塞:

    当 blocking_function() 在 main() 中被调用时,它会阻塞整个事件循环,因为 time.sleep 会让当前线程(在这种情况下是主线程)暂停执行 5 秒。
  结果:

    程序运行时,“Start blocking operation...” 会立即打印,然后程序会暂停 5 秒,因为 blocking_function 阻塞了事件循环。
    5 秒后,“Blocking operation complete.” 和 “Main complete.” 才会打印出来。

 

改进:

为了避免阻塞事件循环,可以使用 run_in_executor 方法,如下所示:

在这个改进版中,blocking_function 被提交给线程池执行器,这样它不会阻塞事件循环。main() 函数会立即完成,等待阻塞操作完成后继续执行。这样可以使事件循环继续处理其他任务,而不被阻塞函数影响。 

 

posted @ 2025-01-16 15:25  tslam  阅读(16)  评论(0)    收藏  举报