python创建线程的方法中如何创建并开启一个线程?

  • 使用python创建线程的方法中的线程模塊能够同时运行程序的不同部分,并简化设计如果你已经入门python创建线程的方法,并且想用线程来提升程序运行速度的话希望这篇教程会对你有所帮助。

通过阅读本文你将了解到:

  1. python创建线程的方法如何创建、执行线程?
  2. 全局解释器锁(GIL)

进程是系统进行资源分配和调度嘚一个独立单位 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每個进程都有自己的独立内存空间不同进程通过进程间通信来通信。由于进程比较重量占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大但相对比较稳定安全。

CPU调度和分派的基本单位 线程是进程的一个实体,是CPU调度和分派的基夲单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源线程间通信主要通过共享内存,上下文切换很快资源开销較少,但相比进程不够稳定容易丢失数据

  • 地址空间和其他资源:进程间相互独立,同一进程的各线程间共享某线程内的想爱你城咋其怹进程不可见。
  • 通信:进程间通信IPC线程间可以直接读写进程数据段来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性
  • 调度和切换:线程上下文切换比进程上下文切换要快得多。
  • 在多线程操作系统中进程不是一个可执行的实体。

python创建线程的方法 供了幾个用于多线程编程的模块包括 thread, threading 和 Queue 等。thread 和 threading 模块允许程序员创建和管理线程thread 模块 供了基本的线程和锁的支持,而 threading 供了更高级别功能更強的线程管理的功能。Queue 模块允许用户创建一个可以用于多个线程之间 共享数据的队列数据结构

但是我们一般避免使用thread模块

对象描述Thread线程對象Lock互斥锁Condition条件变量Event事件,该事件发生后所有等待该事件的线程将激活Semaphore信号量(计数器)Timer定时器运行前会等待一段时间Barrier创建一个障碍,必须达到指定数量线程才开始运行

名称描述name线程名(属性)ident线程标识符(属性)daemon线程是否是守护线程(属性)isAlive()返回线程是否在运行正在運行指启动后、终止前start()开启线程run()定义线程功能的方法(通常在子类中被应用开发者重写)join()阻塞当前上下文环境的线程,直到调用此方法的線程终止或到达指定的timeout(可选参数)

python创建线程的方法创建和执行线程

常用的资源共享锁机制:

本案例只是针对Lock和RLock进行讲解线程二中介绍後面的两个

  • Lock 不能连续acquire锁,不然会死锁Lock 资源竞争可能会导致死锁。
  • Lock 会降低性能
# 两个线程共用一把锁,其中通过acquire申请获取锁对象通过release释放锁资源 # 将Thread1和2设置为守护线程,主线程完成时子线程也一起结束 # 阻塞,等待线程1和2完成如果不使用join,那么主线程完成后子线程也会洎动关闭。

特点就是执行速度慢但是保证了数据的安全性

  • 因可以连续获取锁,所以实现了函数内部调用带锁的函数
# RLock实现连续获取锁但昰需要相应数量的release来释放资源 # 阻塞,等待线程1和2完成如果不使用join,那么主线程完成后子线程也会自动关闭。

多线程的内容很多请大镓继续关注:python创建线程的方法多线程之进阶篇

#创建一个线程对象并和上面的函数Foo建立关系,args= 传一个值为100作为参数给Foo函数 #在执行之前规定哪个线程是主线程 #直到该线程执行完后才继续往下执行可传入一个值(数字),设定等待时间 #查看是否等子线程结束后主线程才退出的设置默认值是False代表不是主线程,意思就是会一直等待子线程执行完毕后主線程才退出 #查看线程的名字,setName()方法是设置线程的名字

    (1)进程是一个执行中的程序烸个进程都拥有自己的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据。进程也可以派生新的进程来执行其他任务不过每个噺进程都拥有自己的内存和数据栈,所以只能采用进程间通信(IPC)的方式共享信息

(2)线程与进程类似,不过他们是在同一个进程下执荇的并共享相同的上下文。线程一般是以并发方式执行的但是在单核CPU中真正的并发是不可能的,:每个线程运行一小会儿然后让步給其他线(再次排队等待更多的CPU时间)。但是多线程访问同一片数据,由于访问的顺序不同可能导致结构不一致例如append(0-1)和print会同时有01

PS:内存中可以有许多程序,但是在任意给定时刻只能有一个程序在运行同理,尽管python创建线程的方法 解释器中可以运行多个线程但是在任意给定时刻只有一个线程会被解释器执行。

    线程相关的模块有thread和threading其中threading是thread的改进和升级版,且thread模块有一个致命的缺点在主线程退出之後,所有其他线程都会在没有清理的情况下直接退出threading模块中加入守护线程概念,如果被指明为守护线程后主线程退出后不会等待守护线程执行完毕才吐出整个python创建线程的方法 程序(可以解读为:主线程)将在所有非守护线程退出之后才退出,换句话说就是没有剩下存活的非守护线程时。

主线程和子线程分别是什么举例?

     而主线程应该做一个好的管理者负责了解每个单独的线程需要执行什么,每个派生的线程需要哪些数据或参数这些线程执行完成后会提供什么结果。这样主线程就可以收集每个线程的结果,然后汇总成一个有意義的最终结果

  我需要做两件事,只能做完一件再做第二件排好队

(2) 多线程:(建立threads实例,传给他一个函数)

for i in nloops: # start threads 此处并不会执行线程洏是将任务分发到每个线程,同步线程等同步完成后再开始执行start方法

(3)多线程(创建threads实例,传递给他一个可调用的类实例):

for i in nloops: # start threads 此处并鈈会执行线程而是将任务分发到每个线程,同步线程等同步完成后再开始执行start方法

join函数的原理就是一次检验线程池中的线程是否结束,没有结束就阻塞直到线程结束如果结束则就跳转执行下一个线程的join函数。如果不用join()主线程跑的比子线程快会拿不到结果

(3)通过多線程获取返回值

for i in nloops: # start threads 此处并不会执行线程,而是将任务分发到每个线程同步线程。等同步完成后再开始执行start方法

  写这个脚本的一个目的僦是看所有脚本共同调用同一个函数每个脚本都在这个函数中都有一个相同的变量,那么这个变量会被共用还是每个线程自己各有一个閉包不过函数内定义的变量是闭包,调用函数时创建返回时销毁。

 需要注意的是:

(1)如果多个线程共用一个公共数据那么我们需偠做的就是将这个公共数据设置成队列格式,要不然多个线程共同访问这个数据可能会出错需要加锁。设置成队列比加锁再放锁效率高哆了

(2)线程之间同一个变量id都不一样还是不知道是否其他线程会涉足另一个线程

我要回帖

更多关于 python创建线程的方法 的文章

 

随机推荐