0

0

使用 Tornado PeriodicCallback 实现多线程并发

聖光之護

聖光之護

发布时间:2025-07-22 17:02:15

|

1000人浏览过

|

来源于php中文网

原创

使用 tornado periodiccallback 实现多线程并发

本文介绍了如何在 Tornado 应用程序中使用 PeriodicCallback 结合线程池来解决耗时任务阻塞主线程的问题。通过将耗时计算任务放入独立的线程中执行,可以确保 Tornado 的 IOLoop 不被阻塞,从而提高应用程序的响应速度和并发能力。

在 Tornado 应用程序中,tornado.ioloop.PeriodicCallback 用于定期执行回调函数。然而,如果回调函数执行时间过长,可能会阻塞 IOLoop,导致应用程序响应变慢。特别是当多个 PeriodicCallback 并发执行时,如果其中一个回调函数耗时较长,其他回调函数可能会被延迟执行。为了解决这个问题,可以将耗时任务放入独立的线程中执行,从而避免阻塞 IOLoop。

使用 run_in_executor() 方法

Tornado 提供了 IOLoop.run_in_executor() 方法,可以将阻塞任务提交到线程池或进程池中执行。该方法接收一个执行器(executor)和一个回调函数作为参数,并将回调函数提交到执行器中执行。

示例代码

以下示例演示了如何使用 run_in_executor() 方法在独立的线程中执行 calculator1 函数:

睿拓智能网站系统-网上商城
睿拓智能网站系统-网上商城

睿拓智能网站系统-网上商城1.0免费版软件大小:5M运行环境:asp+access本版本是永州睿拓信息专为电子商务入门级用户开发的网上电子商城系统,拥有产品发布,新闻发布,在线下单等全部功能,并且正式商用用户可在线提供多个模板更换,可实现一般网店交易所有功能,是中小企业和个人开展个人独立电子商务商城最佳的选择,以下为详细功能介绍:1.最新产品-提供最新产品发布管理修改,和最新产品订单查看2.推荐产

下载
import tornado.ioloop
import tornado.web
from concurrent.futures import ThreadPoolExecutor

# 创建线程池
executor = ThreadPoolExecutor(max_workers=8)

def calculator1():
    """
    模拟一个耗时计算任务
    """
    import time
    time.sleep(0.6) # 模拟耗时操作
    print("calculator1 executed")

def calculator1_runner():
    """
    用于调用 calculator1 函数的包装函数
    """
    tornado.ioloop.IOLoop.current().run_in_executor(executor, calculator1)

def calculator2():
    """
    模拟另一个耗时计算任务
    """
    import time
    time.sleep(1.2)
    print("calculator2 executed")

def calculator2_runner():
    """
    用于调用 calculator2 函数的包装函数
    """
    tornado.ioloop.IOLoop.current().run_in_executor(executor, calculator2)


class WebsocketHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        print("WebSocket opened")

    def on_message(self, message):
        self.write_message("You said: " + message)

    def on_close(self):
        print("WebSocket closed")


class DataRequestHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Data requested")


def make_app():
    return tornado.web.Application([
        (r"/websocket", WebsocketHandler),
        (r"/getData", DataRequestHandler),
    ])

if __name__ == '__main__':
    app = make_app()
    app.listen(8888)

    # 注册 runner 函数用于定期执行
    tornado.ioloop.PeriodicCallback(
        callback=calculator1_runner,
        callback_time=500
    ).start()

    tornado.ioloop.PeriodicCallback(
        callback=calculator2_runner,
        callback_time=1000
    ).start()


    tornado.ioloop.IOLoop.current().start()

代码解释:

  1. 创建线程池: 使用 ThreadPoolExecutor 创建一个线程池,用于执行耗时任务。max_workers 参数指定线程池中线程的最大数量。
  2. 定义回调函数: calculator1 和 calculator2 函数模拟耗时计算任务。calculator1_runner 和 calculator2_runner 函数是包装函数,用于调用 calculator1 和 calculator2 函数,并使用 IOLoop.run_in_executor() 方法将它们提交到线程池中执行。
  3. 注册回调函数: 使用 tornado.ioloop.PeriodicCallback 注册 calculator1_runner 和 calculator2_runner 函数,指定回调时间和回调函数。

注意事项:

  • 确保线程池的大小足够处理并发任务。如果线程池过小,可能会导致任务排队等待执行。
  • 在线程中执行的任务不能直接访问 IOLoop,因为 IOLoop 是线程安全的。如果需要在线程中访问 IOLoop,可以使用 IOLoop.add_callback() 方法将任务提交到 IOLoop 中执行。
  • 在多线程环境下,需要注意线程安全问题。可以使用锁或其他同步机制来保护共享资源。

总结:

通过使用 run_in_executor() 方法,可以将耗时任务放入独立的线程中执行,从而避免阻塞 Tornado 的 IOLoop。这可以提高应用程序的响应速度和并发能力。在实际应用中,可以根据任务的特点选择合适的执行器,例如线程池或进程池。同时,需要注意线程安全问题,确保应用程序的稳定性和可靠性。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

52

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

54

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

15

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号