返回顶部
首页 > 资讯 > 后端开发 > Python >Python 线程
  • 908
分享到

Python 线程

线程Python 2023-01-30 22:01:51 908人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

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

线程

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

进程其实是一个资源单位,而进程内的线程才是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)

 

--结束END--

本文标题: Python 线程

本文链接: https://lsjlt.com/news/179506.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python 线程
    线程 线程指的就是代码的执行过程 进程其实是一个资源单位,而进程内的线程才是CPU上的执行单位 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,...
    99+
    2023-01-30
    线程 Python
  • Python多线程编程,线程锁
    多线程threading 模块创建线程创建自己的线程类线程通信线程同步互斥方法线程锁@需要了解!!!   什么是线程? 线程也是一种多任务的编程方法,可以利用计算机多核资源完成程序的并发运行。 线程又被称为轻量级进程 ...
    99+
    2023-01-30
    线程 多线程 Python
  • python线程编程
    1、线程模式代码#!/usr/bin/python #_*_coding:utf-8_*_ import threading import time def Producer():     print 'chef : 等人来买包子。。...
    99+
    2023-01-31
    线程 python
  • Python进程、线程
    1.线程启动 def run(n): print('%s in thread...'%n) t=threading.Thread(target=run,args=(n,)) t.start #线程等待 t.join 2.多线程同时...
    99+
    2023-01-31
    线程 进程 Python
  • python线程、协程
    线程Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。更多方法:start            线程准备就绪,等待CPU调度setName      为线程设置名称getName      获取线程名称setDae...
    99+
    2023-01-31
    线程 python 协程
  • Python的线程之线程同步
    目录线程同步threading.Lock获取同步锁总结在多线程程序中,它们互相独立打印的时间却是错乱的! 如下图,明明t-0 > t-1 > t-2 (按照线程创建时间早...
    99+
    2024-04-02
  • python多线程
    Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的...
    99+
    2023-01-30
    多线程 python
  • Python 多线程
      文章来源:https://www.runoob.com/python/python-multithreading.html 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的...
    99+
    2023-01-31
    多线程 Python
  • python—多线程
    一、多线程实例  线程时应用程序中工作的最小单位,python中提供了threading模块来对多线程操作,一般多核cpu采用多进程方式,单核才采用多线程方式  方法:  将要执行的方法threading.Thread作为参数传给构造方法(...
    99+
    2023-01-31
    多线程 python
  • Python线程锁
    多线程的优势:可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!so,不使用线程锁, 可能导致错误购买车票--线程锁[root@~]# cat test.py #-*- coding:utf-8 -*- i...
    99+
    2023-01-31
    线程 Python
  • Python的线程
    本文是基于Py2.X 线程 多任务可以由多进程完成,也可以由一个进程内的多线程完成。 我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 可以把运行时间长的任务放到...
    99+
    2023-01-31
    线程 Python
  • Python线程之认识线程安全
    目录一、什么是线程安全?二、在Python中有哪些类是线程安全的?三、如何做到真正线程安全?1.无状态函数2.另一种 化繁为简一、什么是线程安全? 线程安全,名字就非常直接,在多线程...
    99+
    2024-04-02
  • python多线程————3、多线程间通
    1、共享变量 #通过共享变量 import time import threading url_list = [] def get_detail_html(): global url_list while True: ...
    99+
    2023-01-31
    多线程 python
  • python 多线程编程
    使用回调方式 import time def countdown(n): while n > 0: print('T-minus', n) n -= 1 time.sleep...
    99+
    2023-01-31
    多线程 python
  • python之线程、进程
      进程:资源的集合  线程:操作CPU的最小调试单位    最简单的多线程实例如下:#!/usr/bin/python #Author:sean #线程有2种调用方式,如下: #直接调用 import threading import ...
    99+
    2023-01-31
    线程 进程 python
  • Python多线程编程
      一个串行程序需要从每个I/O终端通道来检测用户的输入,然而程序在读取过程中不能阻塞,因为用户输入的到达时间的不确定,并且阻塞会妨碍其他I/O通道的处理。由于串行程序只有唯一的执行线程,因此它需要兼顾执行的多个任务,确保其中的某个任务不会...
    99+
    2023-01-31
    多线程 Python
  • Python进程/线程/协程
    第1章 操作系统历史1.1为什么要有操作系统?程序员无法把所有的硬件操作细节全部了解到,管理这些硬件并且加以优化使用时非常繁琐的工作,这个繁琐的工作就是由操作系统来干的,有了它,程序员就从这些繁琐的工作中解脱了出来,只需要考虑自己的应用软件...
    99+
    2023-01-31
    线程 进程 Python
  • python的多线程
    python多线程 一、线程的概念 线程是CPU分配资源的基本单位。当一程序开始运行,这个程序就变成了一个进程,而一个进程相当于一个或者多个线程。当没有多线程编程时,一个进程相当于一个主线程;当有多线...
    99+
    2023-09-01
    python 开发语言 pycharm
  • python线程入门
    目录 python线程入门 线程与进程 线程 总结 参考 pytho...
    99+
    2023-01-30
    线程 入门 python
  • python多线程-Semaphore(
    Semaphore(value=1) Semaphore对象内部管理一个计数器,该计数器由每个acquire()调用递减,并由每个release()调用递增。计数器永远不会低于零,当acquire()发现计数器为零时,线程阻塞,等待其他线...
    99+
    2023-01-30
    多线程 python Semaphore
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作