不同类中while循环的处理问题咨询
嘿,我来帮你搞定这个问题!先拆解下你当前代码的核心问题:你在runmethod里是串行调用两个带无限循环的方法,first().firstm()里的while True会一直霸占当前线程,永远不会执行到后面的second().secondm()。要让两个循环同时跑起来,你需要用并发编程的思路,下面给你几个实用的解决方案:
问题本质
当前代码的执行逻辑是线性的:先执行第一个类的无限循环,这个循环永远不会结束,导致第二个方法完全没机会运行。你需要让这两个循环在独立的执行流里同时运行,也就是实现并发执行。
方案1:用多线程(最适合IO密集型任务)
多线程是处理这类无限循环打印任务的首选,资源占用低,实现简单。
修改后的代码
首先给循环加个小延迟(避免打印刷屏到看不清),比如修改first.py:
import time class first: count = 0 def firstm(self): while True: print("First Class Method : ", self.count) self.count += 1 # 加计数递增,效果更直观 time.sleep(1) # 每秒打印一次
second.py做同样的修改。
然后修改run.py,用threading模块创建两个线程分别执行两个方法:
from first import first from second import second import threading class run: def runmethod(self): # 为两个方法分别创建线程 thread_first = threading.Thread(target=first().firstm) thread_second = threading.Thread(target=second().secondm) # 启动线程 thread_first.start() thread_second.start() # 等待线程结束(因为是无限循环,这里会一直挂着) thread_first.join() thread_second.join() run().runmethod()
这样两个线程会同时运行,你就能看到两个类的打印内容交替出现了。
方案2:用异步IO(单线程并发,资源占用更少)
如果你的任务是IO密集型(比如打印、网络请求),异步IO是更轻量的选择,用单线程就能实现并发。
修改后的代码
先把两个类的方法改成异步函数:first.py:
import asyncio class first: count = 0 async def firstm(self): while True: print("First Class Method : ", self.count) self.count += 1 await asyncio.sleep(1) # 异步延迟,不阻塞线程
second.py同理修改。
然后修改run.py,用asyncio调度两个异步任务:
from first import first from second import second import asyncio class run: async def runmethod(self): # 同时运行两个异步任务 await asyncio.gather( first().firstm(), second().secondm() ) if __name__ == "__main__": asyncio.run(run().runmethod())
这个方案不需要多线程,靠异步调度就能让两个循环同时执行,资源占用比多线程更低。
方案3:用多进程(适合CPU密集型任务)
如果你的循环里有大量计算(比如复杂运算),多进程能绕过Python的GIL限制,充分利用多核CPU。
修改后的代码
first.py和second.py保留加time.sleep(1)的版本,然后修改run.py:
from first import first from second import second import multiprocessing class run: def runmethod(self): # 创建两个进程 proc_first = multiprocessing.Process(target=first().firstm) proc_second = multiprocessing.Process(target=second().secondm) # 启动进程 proc_first.start() proc_second.start() # 等待进程结束 proc_first.join() proc_second.join() run().runmethod()
多进程的内存空间是独立的,如果你需要在两个类之间共享数据,得用multiprocessing.Queue或者Manager来实现。
额外小贴士
- 无限循环一定要加退出条件!比如可以用一个全局变量或者
signal模块的信号来控制循环停止,不然程序只能强制终止。 - 如果需要共享数据,多线程要注意线程安全(用
threading.Lock加锁),多进程要用专门的共享数据结构。
内容的提问来源于stack exchange,提问作者User

