我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python 线程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python 线程

线程

线程指的就是代码的执行过程

进程其实是一个资源单位,而进程内的线程才是CPU上的执行单位

在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程
线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程

车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一个流水线
流水线的工作需要电源,电源就相当于CPU,所以进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是cpu上的执行单位。

多线程(即多个控制线程)的概念是:在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用一个车间的资源。

例如:
北京地铁与上海地铁是不同的进程,而北京地铁里的13号线是一个线程,北京地铁所有的线路共享北京地铁所有的资源,比如所有的乘客可以被所有线路拉。
线程详解

 

线程和进程的区别

1.同一进程下的多个线程共享该进程内的资源

2.创建线程的开销远远小于进程

创建线程的开销远远小于进程
假设我们的软件是一个工厂,该工厂有多条流水线,流水线工作需要电源,电源只有一个即CPU(单核CPU)
一个车间就是一个进程,一个车间至少一条流水线(一个进程至少一个线程)

创建一个进程,就是创建一个车间(申请空间,在该空间内建至少一条流水线)
而建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小

进程之间是竞争关系:
车间直接是竞争/抢电源的关系,竞争:不同的进程直接是竞争关系,是不同的程序员写的程序运行的,迅雷抢占其他进程的网速,360把其他进程当做病毒干死
线程之间是协作关系:
一个车间的不同流水线式协同工作的关系:同一个进程的线程之间是合作关系,不会自己干自己
线程对比进程详解

 

 

多线程举例

开启一个字处理软件进程,该进程肯定需要办不止一件事情,比如监听键盘输入,处理文字,定时自动将文字保存到硬盘,

这三个任务操作的都是同一块数据,因而不能用多进程。只能在一个进程里并发地开启三个线程,如果是单线程,那就只能是,

键盘输入时,不能处理文字和自动保存,自动保存时又不能输入和处理文字。

 

开启线程的两种方式

Thread实例对象的方法
  # isAlive(): 返回线程是否活动的。
  # getName(): 返回线程名。
  # setName(): 设置线程名。

threading模块提供的一些方法:
  # threading.currentThread(): 返回当前的线程变量。
  # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
 1 #方式一
 2 from threading import Thread
 3 import time
 4 def sayhi(name):
 5     time.sleep(2)
 6     print('%s say hello' %name)
 7 
 8 if __name__ == '__main__':
 9     t=Thread(target=sayhi,args=('egon',))
10     t.start()
11     print('主线程')
方式一
 1 #方式二
 2 from threading import Thread
 3 import time
 4 class Sayhi(Thread):
 5     def __init__(self,name):
 6         super().__init__()
 7         self.name=name
 8     def run(self):
 9         time.sleep(2)
10         print('%s say hello' % self.name)
11 
12 
13 if __name__ == '__main__':
14     t = Sayhi('egon')
15     t.start()
16     print('主线程')
方式二

 

 

 

 统一进程下线程间资源共享

 统一进程下的多个线程共享该进程内的资源

代码举例:

 1 from threading import Thread
 2 
 3 n = 100
 4 
 5 
 6 def task():
 7     global n
 8     n = 0
 9 
10 
11 if __name__ == '__main__':
12     t = Thread(target=task)
13     t.start()
14     t.join()
15     print(n)

 

 守护线程

无论是进程还是线程,都遵循:守护xxx会等待xxx运行完毕后被销毁

需要强调的是:运行完毕并非终止运行 

#1.对主进程来说,运行完毕指的是主进程代码运行完毕

#2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕

 

详细解释:

#1 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,

#2 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。
 1 from threading import Thread
 2 import time
 3 def sayhi(name):
 4     time.sleep(2)
 5     print('%s say hello' %name)
 6 
 7 if __name__ == '__main__':
 8     t=Thread(target=sayhi,args=('egon',))
 9     t.setDaemon(True) #必须在t.start()之前设置
10     t.start()
11 
12     print('主线程')
13     print(t.is_alive())
14     '''
15     主线程
16     True
17     '''
 1 from threading import Thread
 2 import time
 3 def foo():
 4     print(123)
 5     time.sleep(1)
 6     print("end123")
 7 
 8 def bar():
 9     print(456)
10     time.sleep(3)
11     print("end456")
12 
13 
14 t1=Thread(target=foo)
15 t2=Thread(target=bar)
16 
17 t1.daemon=True
18 t1.start()
19 t2.start()
20 print("main-------")
迷惑人的例子

 

互斥锁

 1 from threading import Thread,Lock
 2 import time
 3 
 4 mutex=Lock()  # 线程是共享资源的,所以不需要把锁当参数传
 5 n=100
 6 def task():
 7     global n
 8     mutex.acquire()
 9     temp=n
10     time.sleep(0.1)
11     n=temp-1
12     mutex.release()
13 
14 if __name__ == '__main__':
15     t_l=[]
16     for i in range(100):
17         t=Thread(target=task)
18         t_l.append(t)
19         t.start()
20 
21     for t in t_l:
22         t.join()
23     print(n)

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python 线程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python 线程

线程线程指的就是代码的执行过程进程其实是一个资源单位,而进程内的线程才是CPU上的执行单位在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过
2023-01-30

Python多线程编程,线程锁

多线程threading 模块创建线程创建自己的线程类线程通信线程同步互斥方法线程锁@需要了解!!! 什么是线程?线程也是一种多任务的编程方法,可以利用计算机多核资源完成程序的并发运行。线程又被称为轻量级进程线程的特征线程是计算机多核分配的
2023-01-30

python线程、协程

线程Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。更多方法:start            线程准备就绪,等待CPU调度setName      为线程设置名称getName      获取线程名称setDae
2023-01-31

python线程编程

1、线程模式代码#!/usr/bin/python#_*_coding:utf-8_*_import threadingimport timedef Producer():    print 'chef : 等人来买包子。。。'    ev
2023-01-31

Python进程、线程

1.线程启动def run(n): print('%s in thread...'%n)t=threading.Thread(target=run,args=(n,))t.start#线程等待t.join2.多线程同时启动并等待执行结
2023-01-31

python—多线程

一、多线程实例  线程时应用程序中工作的最小单位,python中提供了threading模块来对多线程操作,一般多核cpu采用多进程方式,单核才采用多线程方式  方法:  将要执行的方法threading.Thread作为参数传给构造方法(
2023-01-31

python多线程

Python 多线程多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度程序
2023-01-30

Python 多线程

文章来源:https://www.runoob.com/python/python-multithreading.html多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面
2023-01-31

Python线程锁

多线程的优势:可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!so,不使用线程锁, 可能导致错误购买车票--线程锁[root@~]# cat test.py #-*- coding:utf-8 -*-im
2023-01-31

Python的线程

本文是基于Py2.X线程多任务可以由多进程完成,也可以由一个进程内的多线程完成。我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。多线程类似于同时执行多个不同程序,多线程运行有如下优点:可以把运行时间长的任务放到后台去处理。用户
2023-01-31

Python多线程编程

一个串行程序需要从每个I/O终端通道来检测用户的输入,然而程序在读取过程中不能阻塞,因为用户输入的到达时间的不确定,并且阻塞会妨碍其他I/O通道的处理。由于串行程序只有唯一的执行线程,因此它需要兼顾执行的多个任务,确保其中的某个任务不会占用
2023-01-31

python之线程、进程

进程:资源的集合  线程:操作CPU的最小调试单位    最简单的多线程实例如下:#!/usr/bin/python#Author:sean#线程有2种调用方式,如下:#直接调用import threadingimport timedef 
2023-01-31

python 多线程编程

使用回调方式import timedef countdown(n): while n > 0: print('T-minus', n) n -= 1 time.sleep(5)# Create
2023-01-31

python多线程————3、多线程间通

1、共享变量#通过共享变量import timeimport threadingurl_list = []def get_detail_html(): global url_list while True: if
2023-01-31

Python进程/线程/协程

第1章 操作系统历史1.1为什么要有操作系统?程序员无法把所有的硬件操作细节全部了解到,管理这些硬件并且加以优化使用时非常繁琐的工作,这个繁琐的工作就是由操作系统来干的,有了它,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件
2023-01-31

python多线程paramiko

初学python,网上找发些关于paramiko实现python多线程的功能,发现相互抄袭占多.别人的总归是别人的,也同时为了练习技术,就自己写了一个基于paramiko免密认证多线程并发脚本.与大家共勉.使用上的问题的同学也可以联系我.刚
2023-01-31

python之多线程

一、threading 模块multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性二、开启线程的两种方式from threading import Threadimport timedef he
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录