0

0

Python中无限循环与独立任务的并发执行策略

聖光之護

聖光之護

发布时间:2025-11-07 12:03:49

|

148人浏览过

|

来源于php中文网

原创

Python中无限循环与独立任务的并发执行策略

本文探讨了python中因无限循环阻塞后续代码执行的问题,并提供了两种解决方案。首先,通过将独立代码移入循环内部实现顺序执行;其次,利用python的`threading`模块实现多任务并发运行,从而允许不同功能(如窗口监控和独立打印)同时进行,提高程序响应性和效率。

在Python编程中,我们经常会遇到需要程序持续运行以监控某些状态或执行周期性任务的情况,例如持续关闭特定窗口。这通常通过一个无限循环(while True)来实现。然而,一个常见的陷阱是,如果将其他需要执行的代码放置在无限循环之后,这些代码将永远无法被执行到。本文将详细分析这一问题,并提供两种有效的解决方案,包括简单的循环内嵌和更高级的并发编程技术——多线程。

理解问题:无限循环的阻塞效应

当Python解释器执行到while True:这样的无限循环时,它会不断地重复循环体内的代码,而不会跳出循环去执行循环体外的任何代码。这意味着,如果你的程序结构如下所示:

while True:
    # 执行一些重复性任务
    pass # 示例占位符

print("hello.") # 这行代码永远不会被执行

那么print("hello.")这行代码将永远不会被执行到,因为它被无限循环“阻塞”了。对于需要同时进行窗口管理和独立输出的场景,这显然不是我们期望的结果。

解决方案一:将独立任务纳入循环

最直接的解决方案是将需要执行的独立任务(例如print("hello."))移动到无限循环的内部。这样,在每次循环迭代时,该任务都会被执行一次。

立即学习Python免费学习笔记(深入)”;

import pyautogui
import time

while True:
    # 查找并关闭Notepad窗口
    for win in pyautogui.getWindowsWithTitle('notepad'):
        print(f"关闭Notepad窗口: {win}")
        win.close()

    # 查找并关闭Google窗口
    for win in pyautogui.getWindowsWithTitle('google'):
        print(f"关闭Google窗口: {win}")
        win.close()

    # 每次循环迭代时打印"hello."
    print("hello.")

    # 可选:添加延迟以避免CPU占用过高,并控制循环频率
    time.sleep(0.5)

优点:

  • 实现简单,易于理解。
  • 适用于独立任务与循环任务之间存在紧密时间关联,或独立任务需要与循环任务同步执行的场景。

缺点:

听脑AI
听脑AI

听脑AI语音,一款专注于音视频内容的工作学习助手,为用户提供便捷的音视频内容记录、整理与分析功能。

下载
  • 如果独立任务的执行频率远低于循环任务,或者独立任务与循环任务在逻辑上是完全独立的,这种方法可能不够优雅。
  • 独立任务的执行仍然是顺序的,即它必须等待前面的窗口关闭操作完成后才能执行。

解决方案二:利用多线程实现并发执行

当需要真正意义上的“同时”执行两个或多个独立任务时,Python的threading模块是更专业的选择。多线程允许程序创建多个执行流,每个流(线程)可以独立地运行一部分代码。

import threading
import time
import pyautogui

# 定义第一个任务:模拟新闻爬取或其他独立功能
def crawl_news():
    while True: # 如果这个任务也需要持续运行
        print("正在执行新闻爬取任务...")
        time.sleep(3) # 模拟耗时操作

# 定义第二个任务:持续检查并关闭指定窗口
def check_windows():
    while True:
        notepad_open = len(pyautogui.getWindowsWithTitle('notepad')) > 0
        google_open = len(pyautogui.getWindowsWithTitle('google')) > 0

        if notepad_open:
            print("检测到Notepad窗口打开,准备关闭...")
            for win in pyautogui.getWindowsWithTitle('notepad'):
                win.close()

        if google_open:
            print("检测到Google窗口打开,准备关闭...")
            for win in pyautogui.getWindowsWithTitle('google'):
                win.close()

        time.sleep(1) # 控制窗口检查频率

# 创建线程
# target参数指定线程要执行的函数
news_process = threading.Thread(target=crawl_news)
window_process = threading.Thread(target=check_windows)

# 启动线程
# start()方法使线程开始执行其target函数
news_process.start()
window_process.start()

# 等待线程完成(对于无限循环的线程,join()会一直阻塞主线程)
# 在此示例中,由于两个线程都是无限循环,主线程会在此处无限等待。
# 如果主线程还有其他任务,可以不调用join(),但需要确保主线程不会过早退出。
news_process.join()
window_process.join()

print("所有线程已启动,主程序将等待它们完成...") # 这行代码在join()无限阻塞的情况下不会被执行

代码解析:

  1. 定义任务函数: 将每个独立的任务封装成一个函数(例如crawl_news和check_windows)。这些函数内部可以包含自己的无限循环。
  2. 创建线程对象: threading.Thread(target=function_name)创建一个线程对象,target参数指定了该线程要执行的函数。
  3. 启动线程: 调用线程对象的start()方法,这将使操作系统为该线程分配资源,并开始执行其target函数。
  4. 等待线程完成(可选): thread.join()方法会阻塞当前线程(通常是主线程),直到被join的线程执行完毕。在上述例子中,由于crawl_news和check_windows内部都是无限循环,join()将使主线程无限期地等待,这对于守护进程或需要长期运行的后台任务是常见的模式。如果主线程有其他后续任务,或者希望主线程在启动子线程后继续执行,可以不调用join(),但需要注意程序的退出机制。

多线程的注意事项:

  • GIL (Global Interpreter Lock): Python的CPython解释器有一个全局解释器锁(GIL),这意味着在任何给定时刻,只有一个线程能真正执行Python字节码。因此,多线程在CPU密集型任务上可能无法实现真正的并行计算,但在I/O密集型任务(如文件读写、网络请求、等待用户输入或系统调用如pyautogui的操作)上仍能显著提高效率,因为它允许一个线程在等待I/O时释放GIL,让另一个线程运行。
  • 线程安全: 当多个线程访问和修改共享数据时,可能会导致数据不一致的问题,这被称为竞态条件。需要使用锁(threading.Lock)或其他同步机制来保护共享资源。本教程的示例中,两个任务没有直接共享数据,因此无需考虑线程安全问题。
  • 资源消耗: 创建和管理线程会消耗一定的系统资源。不应创建过多的线程,以免造成系统负担。
  • time.sleep()的重要性: 在无限循环的线程中,务必添加time.sleep()来引入适当的延迟。这可以防止线程空转,持续占用CPU资源,导致系统性能下降。

总结

当面临Python中无限循环阻塞后续代码执行的问题时,我们可以根据任务的独立性和执行频率选择合适的解决方案:

  • 对于简单且与主循环逻辑紧密相关的任务,将其直接嵌入到无限循环中是最简单有效的方法。
  • 对于需要独立运行、逻辑上互不干扰或需要并行执行的长时间任务,使用threading模块创建多个线程是更健壮和专业的选择。

理解这两种方法及其适用场景,将有助于你编写出更高效、更具响应性的Python程序。在选择多线程时,请务必考虑GIL的影响以及线程安全问题,并在适当的位置使用time.sleep()来优化资源利用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

778

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

686

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

769

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

740

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1445

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

571

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

581

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

752

2023.08.11

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

2

2026.01.27

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

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

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