python:线程

python爬虫知识点:5种线程锁 递归锁是同步锁的一个升级版本,在同步锁的基础上可以做到连续重复使用多次acquire()后再重复使用多次release()的操作,但是一定要注意加锁次数和解锁次数必须一致,否则也将引发死锁现象。条件锁是在递归锁的基础上增加了能够暂停线程运行的功能。并且我们可以使用wait()与notify()来控制线程执行的个数。注意:条件锁可以自由设定一次放行几个线程。事件锁是基于条件锁来做的,它与条件锁的区别在于一次只能放行全部,不能放行任意个数量的子线程继续运行。 阅读详情

进程: 应用程序的实例,有独立的内存空间和系统资源

进程的特点:独立(内存独立,CPU使用独立)启动进程开销大(效率低),进程之间很难共享数据,和数据通信,数据安全高

线程: CPU调度和分派的基本单位,进程中的每个子任务不能独立存在,CPU执行的最小单位,可完成一个独立的顺序控制流程. 

线程的特点: 依赖进程(内存共享,CPU使用独立)启动开销小, 线程之间共享数据容易,方便通信,线程不安全

进程,线程的目的: 都是想同时完成任务. 

多线程: 1.如果在一个进程中同时运行多个线程,用来完成不同的工作,则称之为"多线程"

            2.多个线程交替占用CPU资源,而非真正的并执行.

多线程好处:1.充分利用CPU的资源 

                  2.简化编程模型

                  3.带来良好的用户体验

Python中对线程的处理提供了threading模块 ,还包含其他方法

1.threading.currentThread(): 返回当前的线程变量。

2.threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。

3.threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

4.getName(): 返回线程名。

5.setName(): 设置线程名。

#首先导入模块
import threading
#这是一个线程
print([x for x in range(9)])
#返回当前的线程变量 currentThread()
thread = threading.currentThread()
print('当前线程变量: ',thread)
#输出为:  当前线程变量:  <_MainThread(MainThread, started 13164)>

#用setName设置名字             getName获取名字
thread.setName('主线程')
print('thread name: ',thread.getName())
#输出为:  thread name:  主线程

# threading.enumerate() 返回一个包含正在运行的线程的list
new_th = threading.enumerate()
print('正在运行的线程: ',new_th)
#输出为: 正在运行的线程:  [<_MainThread(主线程, started 1608)>]

#threading.activeCount(): 返回正在运行的线程数量,
# 与len(threading.enumerate())有相同的结果。
print('正在运行的线程个数: ',threading.activeCount())
print('正在运行的线程个数: ',len(threading.enumerate()))
#输出为: 正在运行的线程个数:  1
#        正在运行的线程个数:  1

除了使用方法外,线程模块同样提供了Thread类来处理线程,

1.继承threading.Thread 

2.写构造方法,且必须调用父类的构造方法

3.重写父类的  run 方法,会在 start 之后自动调用

4.实现开始方法,如果重写了  start()  方法,一定要调用父类的  start()   需要调用start()方法才可以执行

Thread类提供了以下方法:

1.run(): 用以执行线程活动的方法。

2.start():启动线程活动使线程达到一个就绪状态


加  注  :    线程的状态

3.join([time]):强制调用某个线程进入执行状态,本线程礼让CPU资源,进入阻塞,休眠状态,直至某个线程退出/抛异常/超时 本线程才进入就绪状态  等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。

4.isAlive(): 返回线程是否活动的。

#首先导入模块 threading 模块   和   time 模块
import threading,time

#写类方法 继承threading.Thread
class MyThread(threading.Thread):
    def __init__(self):   #写构造方法
        threading.Thread.__init__(self)  #这里有两种格式:super(MyThread, self).__init__() 
        print('MyThread __init__')

    def run(self):   #重写父类run方法
        for i in range(10):
            print(self.getName(),i)
            time.sleep(2) # 这是调用time模块 意思是运行的时间再次休眠一秒
            #单位是秒

#创建俩个线程,并让他们去同时启动
t = MyThread()
ts = MyThread()
t.start()
ts.start()
#调用 isAlive() 方法 返回值是 True  False
print('线程是否是活动的: ',t.isAlive())
print('线程是否是活动的: ',ts.isAlive())

'''
输出为: 
MyThread __init__
MyThread __init__
Thread-1 0
Thread-2 0
线程是否是活动的:  True
线程是否是活动的:  True
Thread-1 1
Thread-2 1
Thread-1 2
Thread-2 2
Thread-1 3
Thread-2 3
Thread-1 4
Thread-2 4
Thread-1 5
Thread-2 5
Thread-1 6
Thread-2 6
Thread-1 7
Thread-2 7
Thread-1 8
Thread-2 8
Thread-1 9
Thread-2 9
'''
#测试 join( ) 方法   括号里面添加时间,单位为秒
for i in range(5):

    #当前线程的名字
    print(threading.current_thread().getName(),i)
    time.sleep(2)
    if i == 2:
        #随哪个线程调用,哪个线程就停止
        #括号里面的额数字(10) 是等待时长, 然后就开始执行
        t.join(10)
new_th = threading.enumerate()
print('正在运行的线程: ',new_th)

'''
全部程序输出为:
MyThread __init__
MyThread __init__
Thread-1 0
Thread-2 0
MainThread 0
MainThread 1
Thread-1 1
Thread-2 1
Thread-1 2
MainThread 2
Thread-2 2
Thread-1 3
Thread-2 3
Thread-1 4
Thread-2 4
Thread-1 5
Thread-2 5
Thread-1 6
Thread-2 6
Thread-1 7
Thread-2 7
MainThread 3
Thread-1 8
Thread-2 8
MainThread 4
Thread-1 9
Thread-2 9
正在运行的线程:  [<_MainThread(MainThread, started 2348)>,
 <MyThread(Thread-1, started 9844)>, <MyThread(Thread-2, started 22792)>]

'''

使用函数方法:

       函数实现方式:线程必须依赖函数实现,不能单独运行。当函数结束,线程结束。所以如果想让线程一直运行,就要想办法让程序不结束,比如在程序最后加一个input(),或死循环。

#首先导入包
import threading,time
#
# #以函数方法去实现可以达到资源共享
def something(x):
    for i in range(x):
        print(i)
        time.sleep(2)
threading._start_new_thread(something,(6,))   #括号里面的必须是个元组
input()   #这个很重要
'''
输出为:  0 1 2 3 4 5
'''


一个抢票的例子: 

import  threading,time
nums=50
count=0


class qiangpiao(threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.setName(name)
    def run(self):
        global  nums,count
        while True:
         
            if nums == 0 :
                return
            nums = nums - 1
            count = count + 1
            print("{0}抢到{1}剩余{2}".format(self.getName(),count,nums))
            time.sleep(0.5)  #建议吧时间加长 不然票都会被第一顺序抢到
       

if __name__ == '__main__' :
    huangniu = qiangpiao('黄牛')
    shouji = qiangpiao('手机')
    chuangkou = qiangpiao('窗口')
    huangniu.start()
    shouji.start()
    chuangkou.start()
'''
输出为
黄牛抢到1剩余49
手机抢到2剩余48
窗口抢到3剩余47
窗口抢到4剩余46
黄牛抢到5剩余45
手机抢到6剩余44
手机抢到7剩余43
黄牛抢到8剩余42
窗口抢到9剩余41
手机抢到10剩余40
黄牛抢到11剩余39
窗口抢到12剩余38
手机抢到13剩余37
窗口抢到14剩余36
黄牛抢到15剩余35
手机抢到16剩余34
窗口抢到17剩余33
黄牛抢到18剩余32
手机抢到19剩余31
黄牛抢到20剩余30
窗口抢到21剩余29
手机抢到22剩余28
黄牛抢到23剩余27
窗口抢到24剩余26
手机抢到25剩余25
窗口抢到26剩余24
黄牛抢到27剩余23
手机抢到28剩余22
黄牛抢到29剩余21
窗口抢到30剩余20
手机抢到31剩余19
窗口抢到32剩余18
黄牛抢到33剩余17
手机抢到34剩余16
黄牛抢到35剩余15
窗口抢到36剩余14
手机抢到37剩余13
窗口抢到38剩余12
黄牛抢到39剩余11
手机抢到40剩余10
窗口抢到41剩余9
黄牛抢到42剩余8
手机抢到43剩余7
黄牛抢到44剩余6
窗口抢到45剩余5
手机抢到46剩余4
窗口抢到47剩余3
黄牛抢到48剩余2
手机抢到49剩余1
窗口抢到50剩余0

'''


Python:线程之定位与销毁_python 线程销毁 和平时的故障排查相似,先通过 ps 命令看看目标进程的线程情况,因为已经是 setName 设置过线程名,所以正常来说应该是看到对应的线程的。当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。不过为啥 Python 那个看不到呢? 阅读详情

相关推荐

Python教程:一文掌握Python多线程(很详细)_python 多线程教程

链图片转存中…(img-Odm1w7iU-1713669739824)]

2301_76323084的博客 1664

threading.enumerate是什么意思?

threading.enumerate() 是 Python 中的一个函数,它返回当前程序中正在运行的所有线程的列表。这些线程可能是通过 threading 模块创建的,也可能是通过其他方式创建的。 线程是一种轻量级的进程,它可以在单独的执行流中并发执行多个任务。使用 threading 模块可以方便地创建和管理线程。 举个例子,假设你有一个应用程序,它同时运行了多个线程,你可以使用 thread...

weixin_35750483的博客 735

Python多线程编程(三):threading.Thread类的重要函数和方法

主要介绍了Python多线程编程(三):threading.Thread类的重要函数和方法,本文讲解了线程名称、join方法、setDaemon方法等内容,需要的朋友可以参考下

python 获取当前运行线程名称和数量 threading.enumerate()

python获取当前运行线程名称和数量threading.enumerate()

集电极 9214

python中的线程threading.Thread()使用详解

主要介绍了python中的线程threading.Thread()使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

密码学:一文读懂数字证书

消息摘要算法用于验证数据完整性服务,对称加密算法和非对称加密算法用于保证数据保密性服务,数字签名算法用于抗否认性服务。数字证书集合了多种密码学算法:自身带有公钥信息,可完成相应的加密/解密操作;同时,还带有数字签名,可鉴别消息来源;且自身带有消息摘要信息,可验证证书的完整性;由于证书本身含有用户身份信息,因而具有认证性。

Shujie 2913

Python线程模块| 带有示例的enumerate()方法

Python threading.enumerate()方法 (Python threading.enumerate() Method) enumerate() is an inbuilt method of the threading module in Python. It is used to return the list of all the Thread class objects ...

cumtv80668的专栏 1103

中移物联ML307C模组OPENCPU开发环境搭建全攻略

本文详细介绍了中移物联ML307C模组OPENCPU开发环境搭建的全过程。从OPENCPU模式的核心优势解析,到SDK获取、Python与scons工具安装,再到解读SDK目录结构与实战编译命令,最后提供常见问题避坑指南,帮助开发者快速构建高效的物联网应用编译环境。

weixin_29168393的博客 746

Java 多线程

多线程 9.1 进程与线程 进程是程序的一次动态执行过程,从代码加载,执行到执行完毕的完整过程。 多线程是实现并发机制的一种有效手段。 多线程是指一个进程在执行过程中可产生多个更小的程序单元(线程),这些线程可同时存在,同时运行,而一个进程可能包括多个同时执行的线程。 9.2 Java中线程的实现 继承Thread类 class 类名称 extends Thread{ 属性...; 方法...; public void run(){ 线程主体 } } 为什么启动线程不能直接使用run()方法? 答:线程的

weixin_45833157的博客 1398

SAP Business One自定义表与字段实战:从零构建企业专属数据模型

本文详细介绍了如何在SAP Business One中创建自定义表与字段,从零构建企业专属数据模型。通过实战案例和避坑指南,帮助用户掌握业务适配、流程优化和权限隔离等关键技巧,提升系统灵活性和数据管理效率。特别适合需要扩展标准功能的SAP Business One用户。

weixin_28730927的博客 363

ArcGIS Pro中文帮助离线包安装指南:版本匹配与操作详解

本文详细指导如何为ArcGIS Pro安装中文帮助离线包,解决在线帮助访问不畅的问题。核心在于确保软件版本与离线包的精确匹配,并提供了从版本查看、离线包获取、安装步骤到软件内配置的完整操作流程。文中重点强调了版本匹配的重要性,并分享了高效使用本地帮助搜索及管理多版本帮助的实用技巧。

whisky的博客 990

python 线程(1)-- 常用方法与属性,锁,同步

python 线程(1)-- 常用方法与属性 参考: https://www.cnblogs.com/chenhuabin/p/10082249.html#_label2_7

Python开发分享的博客 1615

银河麒麟系统完美安装EasyConnect

Kylin V10桌面版完美安装EasyConnect

weixin_53874797的博客 1万+

chatgpt赋能python:Python线程停止方法

在Python编程中,正确地停止线程非常重要。多个线程可以并发执行,但必须谨慎处理线程的关闭方式,以确保它们不会占用系统资源或导致其他问题。在上述代码示例中,我们演示了如何正确地停止线程。使用适当的方法,我们可以有效地控制线程的执行状态,并确保程序能够正常终止。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。

tutan123321的博客 1029

Dify 本地插件安装失败?别慌,这篇教程手把手教你解决(解决 the plugin you want to install has a bad signature 报错的问题)

🤯dify安装本地插件报错 PluginDaemonBadRequestError: plugin verification has been enabled, and the plugin you want to install has a bad signature。的解决方案!

XiaoqiangClub的博客 3988

UG NX二次开发(C#)--详细讲述编程模板NXOpen_CS_Wizard的代码意义,帮你轻松进入NXOpen(C#)二次开发

有几个读者私信问我,在看了“NX1957在VS2019上二次开发的环境配置”后,能完成了UG NX二次开发(C#)模板的配置,也能根据模板创建工程,但是对工程文件.cs不甚理解;并且,在UG Styler新建完成后,其也有一个dlx文件和.cs文件,也不清楚怎么使用。本文先对UG NX二次开发(C#)模板文件进行讲解,在下一个博客中,讲解Styler新建后的模板文件。以上就是对编程模板NXOpen_CS_Wizard(c#)的讲解,其实只要明白了逻辑关系,编程实现只是时间问题,祝你好运。

GimiGimmy 1787

python怎样确定线程数_python多线程:控制线程数量

#-*- coding:utf-8 -*-importrequestsfrom requests.exceptions importRequestExceptionimportos, timeimportrefrom lxml importetreeimportthreadinglock=threading.Lock()defget_html(url):"""定义一个方法,用于获取一个url页面的...

weixin_39985365的博客 825

大模型在电力交易功率预测中的应用:短期,超短期,中长期的完整解决方案代码详解

本文介绍了基于大模型的电力交易功率预测系统,该系统覆盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1月)三个时间尺度。文章详细阐述了数据准备与特征工程,包括多源数据集成和特征重要性分析。在模型构建方面,采用了Temporal Fusion Transformer (TFT)模型进行超短期预测,Informer模型进行短期预测,以及N-HiTS模型进行中长期预测。此外,文章还探讨了概率预测与风险分析,并介绍了模型部署与交易策略集成的实现。最后,文章总结了系统的贡献,并展望了未来发展方向,如市

专注AI大模型,软件混淆,授权 1264

python创建线程_Python 线程(一):创建线程

Python中有两个线程模块,分别是thread和threading,threading是thread的升级版。threading的功能更强大。创建线程有3种方法:1、thread模块的start_new_thread函数2、继承自threading.Thread模块3、用theading.Thread直接返回一个thread对象,然后运行它的start方法方法一、thread模块的start_n...

weixin_39530269的博客 360

VC中sqlite的使用

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

chatgpt赋能python:Python并发编程:等待所有线程结束的方法

本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。

pythonxxoo的博客 1032

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python多线程编程:如何优雅地关闭线程

Python 多线程编程中, Threading中的Thread类并没有提供关闭线程的方法、经常会遇到中止主线程时,子线程仍然在运行。那么应该如何正确关闭线程、停止线程呢?提供了两种方式:1种用 线程通信 Event 类方式中止线程,另1种是利用全局状态变量来中止线程,都可以优雅地关闭线程,自动关闭线程,避免丢失数据,文件未关闭等异常,

Python技术探索 6万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Python 线程(一):创建线程

Python中有两个线程模块,分别是thread和threading,threading是thread的升级版。threading的功能更强大。 创建线程有3种方法:     1、thread模块的start_new_thread函数     2、继承自threading.Thread模块     3、用theading.Thread直接返回一个thread对象,然后运行它的start方法...

weixin_34192816的博客 283

Python并发编程:线程和多线程的使用

在编程中,并发编程允许程序同时执行多个独立的任务,这些任务可以在同一时间段内部分地重叠执行,从而提高程序的效率和响应性。在Python 中,并发编程可以通过多种方式实现,其中包括线程(Threads)和进程(Processes)。

TiYong的博客 2196

python并发学习(二):创建线程

python并发学习(二):创建线程 python3中,创建线程的模块是threading.Thread模块。 python中创建线程有两种方法 第一种方法: 使用threading.Thread模块的Thread类构造器创建线程,即是对threading.Thread进行实例化,并调用实例化对象的start方法创建线程。 ​ Thread类的构造器__init__为 def __...

Cchengyoyoy的博客 260

Python学习教程(Python学习路线):Day13-进程和线程

Python学习教程(Python学习路线):进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行,从而缩短程序的执行时间,同时也让用户获得更好的体验。因此在当下不管是用什么编程语言进行开发,实现让程序同时执行多个任务也就是常说的“并发编程”...

chen801090的博客 352
上一篇: 读取 CSV 文件
下一篇: Python 网络编程
Hao_python
博客等级 码龄9年 5粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值