python内置多线程模块的使用

进程和线程

进程

进程是系统进行资源分配和调度的基本单位,是程序执行时的一个实例。程序运行时系统会创建一个进程,并为它分配资源,一个进程都有它自己的地址空间,使得各个进程之间内存地址相互隔离。进程主要用于管理资源。

线程

线程是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,线程间共享进程的所有资源,每个线程也有自己单独的堆栈和局部变量,线程是进程的一个执行流,是CPU调度和分派的基本单位。

多线程

多个线程同时工作用于提高程序运行的效率,提高CPU利用率,这里博主虽然说的是同时,但是也不太恰当,是否是同时进行需要看CPU核心数量和操作系统的分配,下面给大家再说一下两个概念。

并发

并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。通俗地说,就是一个线程运行一段时间后,CPU会切换到另一个线程上,上一个线程就会停在那,等到CPU再次执行。也就是说实际上同一个时间点所执行的线程还是只有一个。

并行

一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。也就是说同一时间多个线程是真正的同时执行的。要实现并行,需要看CPU的核心数量。


无论是并发还是并行,都提高了CPU的利用率,提高了程序的运行效率。

线程的实现

这里我们使用内置的threading模块
导入模块

import threading
import datetime
import time

测试函数,该函数用于测试每个线程所用时间。

def func(name, t):
    time.sleep(t)
    print("i am {}: {}".format(name,datetime.datetime.now()))

创建线程对象,target传入测试函数,name为线程名,args为测试函数参数。

  t1 = threading.Thread(target=func, name='thread_1', args=('thread_1', 6))
  t2 = threading.Thread(target=func, name='thread_2', args=('thread_2', 2))

线程测试
首先打印开始时间,然后执行线程。

print(datetime.datetime.now())
# t1.start()
# t1.join()#等待t1执行完,再执行下面的代码
# t2.start()
# t1.run() #等于t1.start() + t1.join() , run 和 start 只能开启一个
t1.start()
t2.start()
print('===============')
#打印结果如下:
#2020-04-06 17:20:13.644016
#===============
#i am thread_2: 2020-04-06 17:20:15.645857
#i am thread_1: 2020-04-06 17:20:19.646192
#总耗时5秒,同时进行

守护模式

当其他非守护模式执行完了,主线程不等待设置了守护模式的线程

print(datetime.datetime.now())
t1.setDaemon(True) #设置守护模式
t1.start()
t2.start()
print('===============')
#打印结果
#2020-04-06 17:23:41.481112
#===============
#i am thread_2: 2020-04-06 17:23:43.483049

从结果可以看出,当第二个线程执行完后程序就结束了,没有等待第一个线程。

线程锁

当多个线程操作同一全局变量时,可能会对资源进行争抢,从而倒是全局变量数据混乱,我们一般只希望一个线程在操作一个全局变量时其他的线程不能操作,这时候就需要用到线程锁

#实例化线程锁
lock = threading.Lock()
#关锁,在解锁前其他线程需要等待在此
lock.acquire()
"""
这里可以操作全局变量而不被其他线程影响
"""
#解锁
lock.release()

多线程可以大大地提高程序的执行效率,希望这篇博客能对大家的有所帮助,今天的分享就到这里了,祝大家学习进步。

猜你喜欢

转载自blog.csdn.net/weixin_42494845/article/details/105346437
今日推荐