Python在while True循环中使用Threading的可行性及内存泄漏问题咨询
方案可行性与内存泄漏问题解答
你修改后的实现是完全可行的,也不会产生你担心的内存泄漏问题,原因如下:
- Python的线程对象在运行结束、
join()返回后,只要没有其他变量持有它的引用,就会被Python的垃圾回收机制正常清理。你每轮循环里定义的collect1、collect2这些线程对象,都是循环内的局部变量,下一轮循环执行时旧的局部变量会被覆盖,没有额外引用的旧线程对象会被自动回收,不会残留占用内存。 - 你提到的线程无法杀死的问题在这个实现里也不存在,因为你每轮的
collect和send线程都是执行完对应任务就会自动退出,你通过join()等待所有线程执行完成再进入下一轮,完全不需要手动杀线程。
可优化点
当然这个方案还有可以调整的地方,你可以根据自己的需求选择:
- 如果你的
collect_data和send_data函数本身就是单次执行完成就返回的逻辑,当前写法没有任何问题。如果这些函数是常驻运行的,你可以给线程加一个退出标志位,收到KeyboardInterrupt的时候主动设置标志位让线程安全退出,避免数据丢失。
示例逻辑:
# 全局退出标志 exit_flag = False def collect_data1(): while not exit_flag: # 你的采集逻辑 pass try: while True: # 线程创建、启动、join逻辑 collect1 = Thread(target=collect_data1) collect2 = Thread(target=collect_data2) send1 = Thread(target=send_data1) send2 = Thread(target=send_data2) collect = (collect1, collect2) send = (send1, send2) for thread in collect: thread.start() for thread in collect: thread.join() for thread in send: thread.start() for thread in send: thread.join() except KeyboardInterrupt: exit_flag = True break
- 如果每次循环创建线程的开销对你的场景来说太大,可以改用线程池
concurrent.futures.ThreadPoolExecutor,复用线程减少创建销毁的开销,写法更简洁:
from concurrent.futures import ThreadPoolExecutor executor = ThreadPoolExecutor(max_workers=4) while True: try: # 提交collect任务,等待全部完成 collect_futures = [executor.submit(collect_data1), executor.submit(collect_data2)] for f in collect_futures: f.result() # 提交send任务,等待全部完成 send_futures = [executor.submit(send_data1), executor.submit(send_data2)] for f in send_futures: f.result() except KeyboardInterrupt: executor.shutdown(wait=True) break
内容的提问来源于stack exchange,提问作者amentetcircle
相关产品推荐
相关产品推荐

