[Python]核心编程之多线程编程

Python 线程,进程,多线程,多进程以及并行执行for循环笔记 阅读详情

       Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制。Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时候,只有一个程序在CPU中运行。同样,虽然python解释器可以“运行”多个线程,但在任意时刻,只有一个线程在解释器中运行。

 

    对python虚拟机的访问由全局解释器锁(GIL)来控制,这个GIL能保证同一时刻只有一个线程在运行。在多线程环境中,python虚拟机按以下方式执行:

1 设置GIL

2 切换到一个线程去运行

3 运行:(a.指定数量的字节码指令,或者b.线程主动让出控制(可以调用time.sleep()))

4 把线程设置为睡眠状态

5 解锁GIL

6 重复以上所有步骤

没有线程支持的情况:

#! /usr/bin/env python
#coding=utf-8

from time  import sleep,ctime

def loop0():
    print("start loop 0 at:",ctime())
    sleep(4)
    print("loop 0 done at:",ctime())
    
def loop1():
    print("Start loop 1 at:",ctime())
    sleep(2)
    print("loop 1 done at:",ctime())
    
def main():
    print("starting main at:",ctime())
    loop0()
    loop1()
    print("main done at:",ctime())
    
if __name__ == "__main__":
    main()
    
>>>

('starting main at:', 'Fri Jul 25 20:45:51 2014')
('start loop 0 at:', 'Fri Jul 25 20:45:51 2014')
('loop 0 done at:', 'Fri Jul 25 20:45:55 2014')
('Start loop 1 at:', 'Fri Jul 25 20:45:55 2014')
('loop 1 done at:', 'Fri Jul 25 20:45:57 2014')
('main done at:', 'Fri Jul 25 20:45:57 2014')

       可以看到单线程中的两个循环, 只有一个循环结束后另一个才开始。  总共用了6秒多的时间。假设两个loop中执行的不是sleep,而是一个别的运算的话,如果我们能让这些运算并行执行的话,是不是可以减少总的运行时间呢,这就是我们提出多线程的前提。

Python中的多线程模块:thread,threading,Queue。

1  thread ,这个模块一般不建议使用。下面我们直接把以上的例子改一下,演示一下。

#! /usr/bin/env python
#coding=utf-8

import thread
from time  import sleep,ctime

def loop0():
    print("start loop 0 at:%s"%ctime())
    sleep(4)
    print("loop 0 done at:%s"%ctime())
    
def loop1():
    print("Start loop 1 at:%s"%ctime())
    sleep(2)
    print("loop 1 done at:%s"%ctime())
    
def main():
    print("start main at:%s"%ctime())
    thread.start_new_thread(loop0,())
    thread.start_new_thread(loop1,())
    sleep(6)
    print("main done at:%s"%ctime())
    
if __name__ == "__main__":
    main()
    
>>>

start main at:Fri Jul 25 20:47:41 2014
Start loop 1 at:Fri Jul 25 20:47:41 2014
start loop 0 at:Fri Jul 25 20:47:41 2014
loop 1 done at:Fri Jul 25 20:47:43 2014
loop 0 done at:Fri Jul 25 20:47:45 2014
main done at:Fri Jul 25 20:47:47 2014

可以看到实际是运行了4秒两个loop就完成了。效率确实提高了。

 

2 threading模块

首先看一下threading模块中的对象:

Thread    :表示一个线程的执行的对象

Lock     :锁原语对象

RLock    :可重入锁对象。使单线程可以再次获得已经获得的锁

Condition  :条件变量对象能让一个线程停下来,等待其他线程满足了某个“条件”,如状态的改变或值的改变

Event     :通用的条件变量。多个线程可以等待某个事件发生,在事件发生后,所有的线程都被激活

Semaphore  :为等待锁的线程提供一个类似“等候室”的结构

BoundedSemaphore :与semaphore类似,只是它不允许超过初始值

Timer       : 与Thread类似,只是,它要等待一段时间后才开始运行


其中Thread类是你主要的运行对象,它有很多函数,用它你可以用多种方法来创建线程,常用的为以下三种。

1,创建一个Thread的实例,传给它一个函数

2,创建一个Thread实例,传给它一个可调用的类对象

3,从Thread派生出一个子类,创建一个这个子类的实例

 

Thread类的函数有:

getName(self)  返回线程的名字

isAlive(self)  布尔标志,表示这个线程是否还在运行中

isDaemon(self)  返回线程的daemon标志

join(self, timeout=None) 程序挂起,直到线程结束,如果给出timeout,则最多阻塞timeout秒

run(self)  定义线程的功能函数

setDaemon(self, daemonic)  把线程的daemon标志设为daemonic

setName(self, name)  设置线程的名字

start(self)   开始线程执行

 

下面看一个例子:(方法一:创建Thread实例,传递一个函数给它)

#! /usr/bin/env python
#coding=utf-8

import threading
from time import ctime,sleep

loops = [4,2]
    
def loop(nloop,nsec):
    print("start loop %d at : %s"%(nloop,ctime()))
    sleep(nsec)
    print("loop %d done at: %s"%(nloop,ctime()))
    
def main():
    print("start main at :%s"%ctime())
    threads = []
    nloops = range(len(loops))
    
    for i in  nloops:
        t = threading.Thread(
        target=loop,
        args=(i,loops[i]))
        threads.append(t)
        
    for i in nloops:
        threads[i].start()
        
    for i in nloops:
        threads[i].join()
        
    print("main done at: %s"%ctime())
        
if __name__ == "__main__":
    main()
            
>>>

start main at :Fri Jul 25 20:51:51 2014
start loop 0 at : Fri Jul 25 20:51:51 2014
start loop 1 at : Fri Jul 25 20:51:51 2014
loop 1 done at: Fri Jul 25 20:51:53 2014
loop 0 done at: Fri Jul 25 20:51:55 2014
main done at: Fri Jul 25 20:51:55 2014

    可以看到第一个for循环,我们创建了两个线程,这里用到的是给Thread类传递了函数,把两个线程保存到threads列表中,第二个for循环是让两个线程开始执行。然后再让每个线程分别调用join函数,使程序挂起,直至两个线程结束。

 

另外的例子:(方法二:创建一个实例,传递一个可调用的类的对象)

#! /usr/bin/env python
#coding=utf-8

import threading
from time import ctime,sleep

loops = [4,2]

class ThreadFunc(object):
    def __init__(self,func,args,name=''):
        self.name = name
        self.func = func
        self.args = args
        
    def __call__(self):
        apply(self.func,self.args)
    
def loop(nloop,nsec):
    print("start loop %d at : %s"%(nloop,ctime()))
    sleep(nsec)
    print("loop %d done at: %s"%(nloop,ctime()))
    
def main():
    print("start main at :%s"%ctime())
    threads = []
    nloops = range(len(loops))
    
    for i in  nloops:
        t = threading.Thread(
        target=ThreadFunc(loop,(i,loops[i]),
        loop.__name__))
        threads.append(t)
        
    for i in nloops:
        threads[i].start()
        
    for i in nloops:
        threads[i].join()
        
    print("main done at: %s"%ctime())
        
if __name__ == "__main__":
    main()
            
最后的方法:(方法三:创建一个这个子类的实例)
#! /usr/bin/env python
#coding=utf-8

import threading
from time import ctime,sleep

loops = [4,2]

class MyThread(threading.Thread):
    def __init__(self,func,args,name=''):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args
    
    def run(self):
        apply(self.func,self.args)
    
def loop(nloop,nsec):
    print("start loop %d at : %s"%(nloop,ctime()))
    sleep(nsec)
    print("loop %d done at: %s"%(nloop,ctime()))
    
def main():
    print("start main at :%s"%ctime())
    threads = []
    nloops = range(len(loops))
    
    for i in  nloops:
        t = MyThread(loop,(i,loops[i]),
        loop.__name__)
        threads.append(t)
        
    for i in nloops:
        threads[i].start()
        
    for i in nloops:
        threads[i].join()
        
    print("main done at: %s"%ctime())
        
if __name__ == "__main__":
    main()
            



REF:

1,Core Python Programming

2,http://blog.sina.com.cn/s/blog_4b5039210100esc1.html




python实现for循环多线程执行 【代码】python实现for循环多线程执行。 阅读详情

相关推荐

python多线程实现同时执行两个while循环的操作

主要介绍了python多线程实现同时执行两个while循环的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Python中使用for循环来创建多个线程

请注意,线程函数需要根据具体的需求进行定义,这里只是一个简单的例子。另外,在实际应用中,需要根据具体情况对线程的创建和销毁进行适当的管理,以避免出现内存泄漏等问题。在这个例子中,for循环将创建10个线程对象,并且每个线程对象都会执行thread_function()函数中定义的任务。3.使用for循环来创建多个线程对象,每个线程对象都会执行上一步定义的线程函数。2.定义一个线程函数,该函数将作为多个线程的目标函数,用于执行具体的任务。1.导入threading模块。

qq_27661837的博客 5367

EduCoder实践课程——Python程序设计入门答案

记:由于疫情暂时返不了校,然后学校大四毕业年级布置了在线实训的任务,我选择了实践课程Python程序设计入门。以前没有学过,可能是之前有过acm经验,感觉Python挺好入门的,把自己学习过程中的代码记录下来,一是为了自己写报告方便,二来大家可以作为参考代码,如果有更好的代码可以留言,大家相互学习。本文持续更新~ 1、Python初体验     第1关:Hello Python,我来了! # coding=utf-8 # 请在此处添加代码完成输出“Hello Python”,注意要区分大小写! ########## Begin ########## print("Hello Python")

python多线程加速for循环_Python多线程循环

背景:Python脚本:读取文件中每行,放入列表中;循环读取列表中的每个元素,并做处理操作。核心:多线程处理单个for循环函数调用模块:threading第一部分::多线程脚本 (该脚本只有两个线程,t1循环次数t2,运行结果:错误[root@monitor2 logdb]# ./Threadfor.py hostinfo.txtt1: (0~13)t2: (7~15)The Server's H...

weixin_39581964的博客 9608

5GCPE与4G物联网卡兼容实战:通过AT指令修改IMEI实现设备迁移

本文详细介绍了如何通过AT指令修改5GCPE设备的IMEI,实现4G物联网卡的设备迁移。从硬件准备、驱动安装到串口工具配置,再到具体的AT指令操作步骤,提供了全面的实战指南。文章还包含信号优化、APN设置等实用技巧,帮助用户顺利完成设备迁移并提升网络性能。

weixin_28684757的博客 629

RK3588 Ubuntu 20.04 编译 eglinfo 踩坑实录:从 Python 环境配置到 Mali 驱动调试

本文详细解析了在RK3588平台上使用Ubuntu 20.04编译eglinfo的全过程,包括Python环境配置、waf构建系统升级、Mali驱动调试等关键步骤。通过系统级软链接方案、驱动状态诊断和EGL环境验证技巧,帮助开发者快速解决常见问题,构建可靠的图形调试环境。

weixin_29158047的博客 373

基础学习——python多进程、python多线程、numba 加速

以下内容是我为了解决一个for循环遍历速度太慢问题所看的一些内容,总结了以下,虽然这个并没有解决我的问题。

Chaoy6565的博客 2343

VSAN 虚拟机丢失排查与恢复完整方案

VSAN虚拟机(含vCenter)显示无效 检查存储状态:登录ESXi Host Client,确认VSAN存储是否挂载。 若未挂载,通过SSH执行 手动挂载。 验证文件存在:检查虚拟机文件是否完整。 解除文件锁定:删除残留的 .lck 文件 手动注册虚拟机:强制注册虚拟机配置文件。 检查VSAN健康:验证集群节点在线、磁盘组状态正常,并测试节点间网络。 修复元数据:针对损坏对象,谨慎执行修复。 终极恢复:若数据丢失,从备份还原或联系VMware支持,提交日志

sido777的博客 2679

python核心编程之多线程编程

多线程编程 并行处理 多线程编程可以规划成几个执行特定函数的线程 UserRequestThread:负责读取客户端输入,该输入可能来自I/O通道,程序将创建多个线程,每个客户端一个,客户端的请求将会被放入队列中 RequestProcessor:该线程负责从队列中获取请求并进行处理,为第三个线程提供输出 ReplyThread:负责向用户输出,将结果传回给用户,或者把数据写到本地文件系统或数据库中 进程 每个进程都拥有自己的地址空间、内存、数据栈以及其它用于跟踪执行的辅助数据 可以派生新的进程来执行其他任

qq_43527345的博客 182

在Window上安装和配置VTK9.x,并在QT项目中调试VTK是否可用

VTK+MSVC+Qt Creator + CMake配置

qq_42279379的博客 1000

嵌入式存储实战:FAL+SFUD+flashDB三件套在STM32上的完整移植指南(附避坑技巧)

本文提供了一套在STM32上完整移植FAL、SFUD与flashDB嵌入式存储框架的实战指南。详细解析了从SPI驱动配置、SFUD设备识别、FAL抽象层分区到flashDB键值数据库初始化的全流程,并分享了关键的避坑技巧与性能优化建议,帮助开发者构建稳定可靠的嵌入式存储系统。

rnn9storyteller的博客 1016

python核心编程(十五)— 多线程编程

Python、线程和全局解释器锁

WSYW126的博客 818

1️⃣ Coze智能体基础入门教学(2025年全新版本)

不妨设想一下,倘若我们能够打造出一个数字助手,它不但能精准洞悉我们的需求,更可以独立思索、学习以及付诸行动,这便是 AI Agent 的基础理念。它恰似计算机世界里的 “智慧精灵”,能够感知周遭环境、做出判断并采取行动。AI Agent 的发展之路精彩纷呈。它走过了三个重要阶段:起初,它犹如一个被规则束缚的机器人,只能按预设好的指令开展工作。接着,它学会运用统计学方法,通过分析数据来做决策,变得越发灵活。到如今,凭借深度学习技术,它已经能够像人类一样去学习复杂的任务了。

李同学Lino的博客 4085

Python Day24 多线程编程:核心机制、同步方法与实践案例

本文介绍了Python多线程编程的核心技术:1. 线程通信机制:通过Event对象实现线程间协调,以动物赛跑案例展示如何通过事件通知终止线程;2. 线程安全队列:分析Queue、PriorityQueue等线程安全容器的使用方法;3. 条件变量:使用Condition实现生产者-消费者模式,通过等待/唤醒机制协调线程;4. 线程状态管理:解析线程生命周期各状态转换关系;5. 线程池应用:通过售票和小说爬虫案例演示ThreadPoolExecutor的高效并发处理。最后给出两个实践作业:生产者-消费者模型实现

ihghhfffv的博客 1479

手把手教你用git上传项目到GitHub(图文并茂,这一篇就够了),相信你一定能成功!!

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。即使是付费帐户,每个月不超过10美刀的费用也非常便宜。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一起完成这个项目。优点在于,他支持多人共同完成一个项目,因此你们可以在同一页面对话交流。 创建自己的项目,并备份,代码不需要保存在本地或者服务器,GitHub做得非常理想。 学习Git也有很多好处。他被视为一个预先维护过程,你可以按自己

左手の明天的博客 3万+

Agent Skills应用解析:构建可扩展、高效率AI探员

Agent Skills是一个简洁而强大的概念:它是一个包含组织化的指令、脚本和资源的文件夹,智能体可以动态地发现并加载这些内容,以在特定任务中表现更佳。可组合性(Composability):一个Agent Skill是一个独立的、封装良好的能力单元。开发者可以为不同的功能(例如PDF处理、网络浏览、数据分析)创建独立的技能,然后根据需要将它们组合起来,赋能不同的智能体。这意味着不再需要为每个用例构建碎片化、定制设计的智能体,而是可以通过组合现有技能来快速构建新的专业智能体。

形上得其象,形下合于数;阴阳自济,玄理自明。 1627

《Python核心编程》多线程编程

线程和Python 全局解释锁 Python代码的执行是由Python虚拟机进行控制的。Python在设计时是这样考虑的,在主循环中同时只能有一个控制线程在执行,就像单核CPU系统中的多线程一样。内存中可以有许多程序,但是在任意给定时刻只能有一个程序在运行。同理,尽管Python解释器中可以运行多个线程,但是在任意给定时刻只有一个线程会被解释器执行。 对Python虚拟机的访问是由全局解释锁...

Mai_Dreizehn的博客 304

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python多线程编程——《python核心编程第四章》

1 引言首先区分几个概念:程序——能被计算机执行的文件; 进程——处于执行状态的程序,包含计算机为其分配的空间、内存、数据栈等资源; 线程——也称轻量级进程(迷你进程),在同一进程下执行,拥有相同的上下文(线程间消息传递更方便);可以认为他们是在同一主进程或“主线程”中并行运行的一些“迷你进程”。从上面的概念可以发现:针对能够采用多线程编程的任务,如一个进程可以拆解为多个并发执行的子任务的情况,其...

qq_36312376的博客 200

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

《python核心编程》(多线程编程)

多线程编程线程和进程python、线程和全局解释器锁thread模块threading模块 线程和进程 进程: 计算机程序:磁盘中可执行的,二进制(或其他类型)的数据。它们只有被读取到内存中,被操作系统调用的时候才开始它们的生命期。 进程:是程序的一次执行。每个进程都要自己的地址空间、内存、数据栈以及其他记录其运行轨迹的辅助数据。 操作系统管理在其上运行的所有进程,并为这些进程公平的分配时间。...

zhuix7788的专栏 361

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Python核心编程笔记————多线程编程(一)

文章目录简介线程和进程进程线程 简介 . 多线程编程的目的是提高整个任务的性能。其对具有如下特点的编程任务是非常理想的:   需要多个并发活动;   每个活动的处理顺序是不确定的(随机的)。   使用多线程来规划合适的编程任务可以降低程序的复杂性,使其更加清晰、高效、简介。 线程和进程 进程 . 进程是一个执行中的程序,每个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据。操作...

rest_in_peace的博客 2120

Python核心编程——第4章 多线程编程 笔记

Python核心编程——第4章 多线程编程 笔记引言通用概念python相关概念多线程的实现方式两大模块三种替代方案使用Thread类主要的三种创建线程的方法相关模块代码实现部分(python3)最简单的线程,定时等待使用锁来等待使用Thread类的三种创建线程的方法之一:创建Thread实例,传函数使用Thread类的三种创建线程的方法之二:创建Thread实例,传可调用类使用Thread类的三...

u014472777的专栏 325

Python核心编程:第18章 多线程编程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34240520的博客 127

18 多线程编程 - 《Python 核心编程》

???? 引言/动机 ???? 线程和进程 ???? 线程和 Python ???? thread 模块 ???? threading 模块 ???? 生产者-消费者问题和 Queue 模块 ???? 相关模块 18.1 引言/动机 18.2 线程和进程 什么是进程? 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据。它们只有在被读取到内 存中,被操作系...

dianzuoting0319的博客 197

《python核心编程》笔记-18 多线程编程(2)

《python核心编程》笔记-18 多线程编程(2)全局解锁器GIL 全局解锁器GIL python代码的执行由python虚拟机(也叫解释器主循环)来控制。Python在设计之初就考虑到要在放在主循环中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时刻,只有一个程序在CPU中运行。同样地,虽然python解释器可以”运行”多个线程,但在任意时刻,只...

qq_26126831的博客 206

python 多线程代码_python 多线程 联系代码(Python核心编程里面的例子)

先自定义一个线程的子类,这个跟Java很像,主要功能的实现实在run方法里面# -*- coding: utf8 -*-import threadingimport timeclass MyThread(threading.Thread):'''这个是自定义线程的子类'''def __init__(self,func,args,name=''):threading.Thread.__init__(...

weixin_33586619的博客 232
上一篇: [Python]collections模块中的Counter类
下一篇: [Python]核心编程之生产者-消费者和Queue模块
Scandinavians
博客等级 码龄19年 36粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值