Python学习:多线程 和 多进程
导入 定义线程入口函数 创建 调用 主线程等待子线程完成后,继续执行后续代码。 定义锁对象 定义线程入口函数 启动10个线程,修改账户余额。 主线程等待所有子线程完成后,输出最终余额。 创建 启动线程后,主线程可以立即结束,不需要等待子线程完成。 导入 定义目标函数 启动多个进程,等待其完成。 查看任务管理器,确认多个进程占用不同CPU核心。 创建 启动多个进程,共享返回字典 主进程等待所有子进程完成后,收集并打印结果。
发布日期:2021-04-30 21:01:13
浏览次数:139
分类:精选文章
本文共 2664 字,大约阅读时间需要 8 分钟。
Python学习:多线程和多进程
进程和线程的概念
在面试中,常被问及进程和线程的区别。简单来说,进程是运行中的程序。当我们在计算机上运行如QQ、浏览器等应用程序时,每个程序都是一个进程。这些进程在操作系统中运行,并且每个进程至少包含一个线程。
在Windows的任务管理器中,我们可以看到系统上运行的进程列表,如QQ、搜狗输入法等。这些进程在运行时,会加载对应的可执行文件(如.exe文件)到内存中,从而成为进程。每个进程至少包含一个线程,负责执行代码和管理运行状态。
线程是操作系统创建的,用于执行代码和管理运行状态。没有线程,操作系统无法维护代码的执行状态。Python程序的运行依赖于主线程,它负责解释和执行代码。当主线程完成任务后,整个进程结束。
多线程的作用
现代计算机的CPU通常是多核的,每个核可以执行代码。通过使用多线程,可以让多个CPU核心同时执行任务,提高效率。例如,压缩多个大文件或同时抓取多个网页的内容。
创建线程
在Python中,可以通过threading库创建新线程。代码示例:
import threadingimport timedef thread_func(): print('子线程开始') time.sleep(5) print('子线程结束')thread = threading.Thread(target=thread_func)thread.start()print('主线程结束') 步骤解释:
threading和time模块。thread_func,包含待执行代码。Thread实例,指定目标函数和参数。start()方法启动新线程。共享数据的访问控制
多线程开发中,共享数据可能存在竞态问题。使用锁可以解决这个问题。例如,银行存款系统中的账户余额:
from threading import Lockimport timebank = {'byhy': 0}bank_lock = Lock()def deposit(thead_idx, amount): bank_lock.acquire() time.sleep(0.1) bank['byhy'] += amount bank_lock.release()thread_list = []for idx in range(10): thread = Thread(target=deposit, args=(idx, 1)) thread.start() thread_list.append(thread)for thread in thread_list: thread.join()print('最后账号余额为:', bank['byhy']) 步骤解释:
bank_lock,用于控制共享数据访问。deposit,在操作共享数据前获取锁,执行后释放锁。Daemon线程
Daemon线程在主线程结束时自动终止。创建方式:
from threading import Threadimport timedef thread_func(): time.sleep(2) print('子线程结束')thread = Thread(target=thread_func, daemon=True)thread.start()print('主线程结束') 步骤解释:
Thread实例,设置daemon=True。多进程的概念
Python的多线程由于GIL限制,无法充分利用多核CPU。因此,在计算密集型任务中,使用多进程库(如multiprocessing)更为合适。例如:
from multiprocessing import Processimport timedef f(): while True: b = 53 * 53if __name__ == '__main__': processes = [] for _ in range(2): p = Process(target=f) p.start() processes.append(p) for p in processes: p.join()
步骤解释:
multiprocessing模块。f,执行计算密集型任务。多进程中的数据共享
使用多进程共享数据,需通过共享对象。例如:
from multiprocessing import Process, Managerimport timedef f(task_no, return_dict): time.sleep(2) return_dict[task_no] = task_noif __name__ == '__main__': manager = Manager() return_dict = manager.dict() processes = [] for i in range(10): p = Process(target=f, args=(i, return_dict)) p.start() processes.append(p) for p in processes: p.join() print('结果:', return_dict) 步骤解释:
Manager对象,用于管理共享资源。return_dict。总结
进程和线程是操作系统管理程序和任务的基本机制。线程用于多任务处理,多线程开发可提高效率,但需注意线程安全。多进程适用于计算密集型任务,可充分利用多核资源。通过合理使用锁和共享对象,可以实现线程安全,确保多线程和多进程程序的正确运行。
发表评论
最新留言
很好
[***.229.124.182]2026年05月27日 16时00分36秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!