当前位置:首页>python>Python asyncio 实战:用异步轮询构建工业设备监控系统

Python asyncio 实战:用异步轮询构建工业设备监控系统

  • 2026-06-30 02:40:06
Python asyncio 实战:用异步轮询构建工业设备监控系统

🤔 你是否也遇到过这些问题?

在工控、物联网或上位机开发中,有一类需求几乎无处不在——同时监控多台设备,实时采集数据,界面还不能卡顿

听起来不难?但真正动手写的时候,问题就来了。

用多线程?5台设备还好,50台设备线程一多,上下文切换的开销就让 CPU 叫苦不迭,而且线程间共享状态的同步问题,一不小心就是个难以复现的 Bug。用同步轮询?更别提了,一台设备通信超时,整个程序就堵在那儿,界面直接假死。

有没有一种方式,既能高并发地轮询多台设备,又能保持 UI 流畅响应,还能优雅地处理超时和通信错误?

有,这就是 asyncio 的用武之地。

本文将基于一个完整的工业设备监控项目,从架构设计到代码实现,带你彻底搞清楚:

  • ▸ asyncio 在 I/O 密集场景下的核心优势
  • ▸ 异步后端与 Tkinter UI 的线程桥接方案
  • ▸ 生产级的错误处理与优雅退出机制

代码完整可运行,直接 copy 就能跑。


🧩 问题深度剖析:同步轮询的三座大山

在谈解决方案之前,先把问题说透。

第一座山:阻塞式 I/O 拖垮并发

传统同步写法,轮询设备大概长这样:

python1# 同步轮询 —— 看起来没问题,实则暗藏隐患2while True:3for device in devices:4        data = device.read()   # 如果这里阻塞 2 秒...5update_ui(data)6    time.sleep(0.5)

如果 device.read() 因为网络抖动阻塞了 2 秒,后面所有设备都得排队等着。5 台设备串行轮询,最坏情况下一轮要 10 秒,实时性从何谈起?

第二座山:多线程的复杂度税

"那就每台设备开一个线程嘛。"这个想法没错,但代价是你得开始处理:

  • ▸ 线程间共享队列的加锁问题
  • ▸ 某个线程崩溃后的异常捕获与重启
  • ▸ 程序退出时如何优雅地 join 所有线程

设备一多,这套维护成本直线上升。而且线程是操作系统级资源,真到几十上百台设备,内存和调度开销相当可观。

第三座山:UI 线程的铁律

Tkinter(以及绝大多数 GUI 框架)有一条铁律:所有 UI 操作必须在主线程执行

这意味着你不能在子线程里直接调用 label.config(text=...) 或 tree.item(...),否则轻则显示异常,重则直接崩溃。这一点坑过很多人,却鲜少被系统性地讲清楚。


💡 核心要点:asyncio 为什么适合这个场景

asyncio 的本质是单线程的协作式并发。它用一个事件循环调度所有协程,协程在等待 I/O 的时候主动让出控制权,事件循环趁机去跑其他协程。

对于设备轮询这类场景,大部分时间都在等网络响应(I/O 等待),CPU 实际上是空闲的。asyncio 恰好能把这段空闲时间充分利用起来,在同一个线程内并发轮询 N 台设备,开销极低。

用一个生活化的比喻:同步轮询像是一个服务员,点完一桌菜之后站在厨房门口等出菜,其他桌的客人只能干等。asyncio 则像是一个经验丰富的服务员,点完菜就去招呼下一桌,菜好了再回来端,效率天壤之别。

关键特性对比:

特性
同步轮询
多线程
asyncio
并发能力
串行,无并发
有限(线程数)
高(协程数量几乎无上限)
I/O 等待处理
阻塞全局
阻塞当前线程
让出控制权,不阻塞
线程安全复杂度
低(单线程内无竞争)
内存开销
较高
适用场景
简单单设备
CPU 密集
I/O 密集、多设备并发

🖼️ 运行效果

🏗️ 解决方案设计:三层架构拆解

这套监控系统的架构可以清晰地分为三层:

1┌─────────────────────────────────────┐2│         Tkinter UI 主线程            │  ← 只做渲染,不碰 I/O3│   每 100ms 从线程安全队列拉数据       │4└──────────────┬──────────────────────┘5               │  thread_queue.Queue(线程安全桥接)6┌──────────────▼──────────────────────┐7│      asyncio 后台线程                │  ← 独立线程运行事件循环8│   data_consumer 协程转发数据         │9└──────────────┬──────────────────────┘10               │  asyncio.Queue(协程间通信)11┌──────────────▼──────────────────────┐12│   AsyncDevicePoller × N(协程)      │  ← 并发轮询所有设备13│   每台设备独立的 poll_loop            │14└─────────────────────────────────────┘

这个设计的精妙之处在于:asyncio 后台线程和 Tkinter 主线程之间,用一个线程安全的 thread_queue.Queue 解耦,两侧互不干扰,各司其职。

1️⃣ 设备轮询协程:AsyncDevicePoller

每台设备对应一个 AsyncDevicePoller 实例,核心是 poll_loop 协程:

python1async def poll_loop(self, data_queue: asyncio.Queue) -> None:2while True:3        start_ts = time.monotonic()4try:5# asyncio.wait_for 实现超时控制,不会阻塞其他协程6            raw_data = await asyncio.wait_for(7                self._read_device(), timeout=self.timeout8            )9            device_data = DeviceData(10                device_id=self.device_id,11                timestamp=time.time(),12                values=raw_data,13                status="ok"14            )15            self._consecutive_errors = 01617except asyncio.TimeoutError:18# 超时不崩溃,记录状态继续运行19            device_data = DeviceData(20                device_id=self.device_id, timestamp=time.time(),21                values={}, status="timeout", error_msg="读取超时"22            )23            self._consecutive_errors += 12425except ConnectionError as e:26            device_data = DeviceData(27                device_id=self.device_id, timestamp=time.time(),28                values={}, status="error", error_msg=str(e)29            )30            self._consecutive_errors += 13132try:33            data_queue.put_nowait(device_data)34except asyncio.QueueFull:35pass  # 队列满时静默丢弃,不阻塞轮询3637# 精确控制轮询间隔,扣除本次耗时38        elapsed = time.monotonic() - start_ts39await asyncio.sleep(max(0.0, self.poll_interval - elapsed))

这里有几个细节值得注意:

asyncio.wait_for 是超时控制的标准姿势。 它会在超时后取消内部协程并抛出 asyncio.TimeoutError,不会影响其他正在运行的协程。

轮询间隔的精确控制。 用 time.monotonic() 记录本次轮询实际耗时,然后用 poll_interval - elapsed 作为 sleep 时间,保证轮询频率稳定,不会因为设备响应快慢而产生漂移。

队列满时静默丢弃。put_nowait 在队列满时抛出 asyncio.QueueFull,这里选择静默丢弃而非阻塞,是一种背压(backpressure)策略——UI 来不及消费时,宁可丢弃旧数据,也不能让轮询协程堵住。

2️⃣ 数据桥接:从 asyncio 到 Tkinter

这是整个架构最关键的一环。asyncio 的 Queue 不是线程安全的,不能直接被 Tkinter 主线程访问;而 thread_queue.Queue 是线程安全的,但不能在协程里用 await 等待。

解决方案是一个专门的 data_consumer 协程,充当"翻译官":

python1async def data_consumer(2    async_queue: asyncio.Queue,3    ui_queue: thread_queue.Queue,4    stop_event: asyncio.Event5) -> None:6while not stop_event.is_set():7try:8# 在 asyncio 侧等待数据(可被 await,不阻塞事件循环)9            data: DeviceData = await asyncio.wait_for(10                async_queue.get(), timeout=0.211            )12# put_nowait 是线程安全的,Tkinter 主线程可以安全读取13            ui_queue.put_nowait(data)14            async_queue.task_done()15except asyncio.TimeoutError:16continue  # 超时继续循环,检查 stop_event

timeout=0.2 的设计让 stop_event 的检查不会被无限期阻塞——即使没有数据,最多等 200ms 就会重新检查一次停止信号。

3️⃣ 后台线程:asyncio 事件循环的独立空间

Tkinter 的主线程已经在跑自己的事件循环(mainloop()),asyncio 的事件循环不能与之共存在同一线程。解决方案是开一个独立的守护线程,在里面跑完整的 asyncio 事件循环:

python1def run_async_backend(2    ui_queue: thread_queue.Queue,3    stop_event_holder: list4):5async def _main():6# ... 初始化设备、创建队列、启动协程 ...7        stop_event = asyncio.Event()8        stop_event_holder.append(stop_event)  # 暴露给主线程910        tasks = [11            asyncio.create_task(poller.poll_loop(async_queue))12for poller in pollers13        ]14        consumer = asyncio.create_task(15data_consumer(async_queue, ui_queue, stop_event)16        )1718await stop_event.wait()  # 阻塞等待停止信号1920# 优雅取消所有任务21        consumer.cancel()22for t in tasks:23            t.cancel()24await asyncio.gather(consumer, *tasks, return_exceptions=True)2526    asyncio.run(_main())

stop_event_holder 用列表传递是个小技巧——列表是可变对象,后台线程可以往里 append event 引用,主线程再取出来使用,绕开了跨线程传递不可变对象的限制。

4️⃣ 优雅停止:跨线程触发 asyncio 事件

停止后台轮询时,需要从 Tkinter 主线程通知 asyncio 事件循环。但 asyncio.Event.set() 必须在其所属的事件循环线程调用,直接跨线程调用是不安全的。

正确做法是用 call_soon_threadsafe

python1def _stop_polling(self):2if self._stop_event_holder:3        stop_ev: asyncio.Event = self._stop_event_holder[0]4# 线程安全地在 asyncio 事件循环中调度 set()5        stop_ev._loop.call_soon_threadsafe(stop_ev.set)

call_soon_threadsafe 是 asyncio 专门为跨线程调度设计的接口,它会将回调安全地投递到目标事件循环的队列中执行,不存在竞态条件。

5️⃣ UI 刷新:定时轮询而非回调推送

Tkinter 的 after 方法实现了一个简单的定时器,每 100ms 从线程安全队列批量消费数据:

python1def _schedule_ui_poll(self):2    self._drain_ui_queue()3if self._running:4        self.after(self.POLL_INTERVAL_MS, self._schedule_ui_poll)56def _drain_ui_queue(self):7# 单次最多处理 50 条,避免一次处理太多导致 UI 卡顿8for _ in range(50):9try:10            data: DeviceData = self._ui_queue.get_nowait()11            self._update_row(data)12except thread_queue.Empty:13break

单次处理上限 50 条是个经验值。如果队列积压了大量数据(比如系统刚启动时),一次性全部处理会让主线程忙碌太久,导致界面短暂无响应。分批处理,每批最多 50 条,100ms 后再处理下一批,UI 就始终保持流畅。


⚠️ 踩坑预警:这些地方最容易出问题

坑一:直接在子线程操作 Tkinter 控件

python1# 错误!在 asyncio 后台线程里直接更新 UI2label.config(text="新数据")  # 可能崩溃或产生不可预期的行为

所有 UI 操作必须通过队列转发到主线程,或者用 root.after(0, callback) 在主线程调度。

坑二:asyncio.Event 跨线程直接调用 set()

python1# 错误!直接跨线程调用2stop_event.set()34# 正确!通过 call_soon_threadsafe 投递5stop_ev._loop.call_soon_threadsafe(stop_ev.set)

坑三:忽略 asyncio.gather 的 return_exceptions=True

取消任务时,被取消的协程会抛出 asyncio.CancelledError。如果不加 return_exceptions=True,第一个取消异常就会让 gather 抛出,后续任务得不到清理。

坑四:轮询间隔没有扣除执行耗时

python1# 不精确:每次轮询实际间隔 = 执行时间 + sleep 时间2await asyncio.sleep(self.poll_interval)34# 精确:固定轮询频率5elapsed = time.monotonic() - start_ts6await asyncio.sleep(max(0.0, self.poll_interval - elapsed))

📊 性能参考数据

以下数据在 Windows 11、Python 3.11、5 台模拟设备(轮询间隔 0.2~1.0s)条件下测试:

指标
同步串行轮询
asyncio 并发轮询
5 台设备单轮耗时(平均)
~750ms
~200ms
CPU 占用(空闲等待期)
~15%
~2%
单设备超时对其他设备影响
全部阻塞
完全隔离
内存占用(5 台设备)
~18MB
~16MB

数据仅供参考,实际效果因设备数量、网络延迟、硬件配置而异。


🎯 三句话总结


  1. asyncio 的核心价值在于 I/O 等待期间的协程切换,而非多核并行——设备轮询这类 I/O 密集场景是它的主场。


  2. asyncio 后台线程 + thread_queue.Queue + Tkinter 主线程定时轮询,是解决异步后端与 GUI 框架共存的经典三层桥接模式。


  3. 优雅退出不是可选项——call_soon_threadsafe + asyncio.gather(return_exceptions=True) 是生产代码的标配。


💬 欢迎讨论

在你的项目中,设备并发轮询遇到过哪些棘手的问题?是线程安全、超时处理,还是 UI 卡顿?欢迎在评论区分享你的经验。

如果你正在做工控上位机、物联网网关或设备监控平台,这套架构可以直接作为基础框架落地,按需替换 _read_device 里的通信协议(Modbus TCP、OPC UA、串口等)即可。


#Python#asyncio#上位机开发#工控软件#性能优化#Tkinter#物联网

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 02:29:43 HTTP/2.0 GET : https://f.mffb.com.cn/a/500076.html
  2. 运行时间 : 0.152706s [ 吞吐率:6.55req/s ] 内存消耗:4,575.44kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=dd201a5c1811ab59139813cef4593e36
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000610s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000767s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000292s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000291s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000468s ]
  6. SELECT * FROM `set` [ RunTime:0.000200s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000579s ]
  8. SELECT * FROM `article` WHERE `id` = 500076 LIMIT 1 [ RunTime:0.012162s ]
  9. UPDATE `article` SET `lasttime` = 1783016983 WHERE `id` = 500076 [ RunTime:0.005098s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000263s ]
  11. SELECT * FROM `article` WHERE `id` < 500076 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000480s ]
  12. SELECT * FROM `article` WHERE `id` > 500076 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000380s ]
  13. SELECT * FROM `article` WHERE `id` < 500076 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006674s ]
  14. SELECT * FROM `article` WHERE `id` < 500076 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.050454s ]
  15. SELECT * FROM `article` WHERE `id` < 500076 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.006403s ]
0.155666s