找网站开发,台州做鞋子网站,重庆网站建设公司费用,wordpress抽奖源码python的多线程详细使用 1.什么是线程2.线程的作用3.导入线程4.创建线程启动线程线程阻塞线程的方法 守护线程线程阻塞2个都是守护线程1个是守护线程 线程间通信 1.什么是线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中#xff0c;是进程中的实际运作单… python的多线程详细使用 1.什么是线程2.线程的作用3.导入线程4.创建线程启动线程线程阻塞线程的方法 守护线程线程阻塞2个都是守护线程1个是守护线程 线程间通信 1.什么是线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流一个进程中可以并发多个线程每条线程并行执行不同的任务。
2.线程的作用
Python中的程序默认是只有一个主线程的也就是说执行程序的时候你写的代码都是串行执行的CPU利用率可能并没有得到很好的利用还有很多的空闲而这个时候利用多线程多线程是指同时使用多个线程执行代码以实现并发执行任务的目的CPU利用率将会大大提升程序速度也就能大大增快
3.导入线程
多线程开发推荐使用 threading 模块
from threading import Thread4.创建线程
调用threading.Thread类
threading.Thread(targetNone, nameNone, args(), kwargs{})
# target 指要创建的线程的方法名name 指给此线程命名命名后可以调用 threading.current_thread().name 方法输出该线程的名字
# args/kwargs 指 target 指向的方法需要传递的参数必须是元组形式如果只有一个参数需要以添加逗号实例化线程
# method 为线程要执行的具体方法
thread01 Thread(targetmethod) #method要使用线程的函数名称实现两条线程
thread02 Thread(targetmethod)实现多个线程依次类推
启动线程
thread01.start()
thread01.start()线程阻塞
等待所有线程执行完成再进行下一步操作
thread01.join()
thread02.join()
# 等待线程执行完成线程的方法
方法描述threading.current_thread()返回当前线程的信息threading.enumerate()返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前不包括启动前和终止后的线程threading.active_count()返回正在运行的线程数量与len(threading.enumerate())有相同的结果
import time
import threading
from threading import Thread
def task():num 0for i in range(100):num * iresult.append(num)thread01 Thread(targettask)
thread02 Thread(targettask)
if __name__ __main__:thread01.start()thread02.start()print(正在运行的线程数量, threading.active_count())print(将当前所有线程的具体信息展示出来, threading.enumerate())print(返回当前线程的信息, threading.current_thread()) 2
将当前所有线程的具体信息展示出来 [_MainThread(MainThread, started 12752)]
返回当前线程的信息 _MainThread(MainThread, started 12752)守护线程
Python在进程启动起来后会自动创建一个主线程主线程默认会等待所有线程执行完成之后再退出但是如果我们设置了守护线程主线程任务一旦完成所有子线程将会和主线程一起结束即使子线程没有执行完也会退出。
方法一设置守护线程是创建子线程对象时以daemon参数的形式指定
thread01 Thread(targettask,namet1,daemonTrue)方法二通过setDaemon(True)的形式进行设置
thread01.setDaemon(True)在这里插入代码片线程阻塞
假如说我们不希望主线程完成直接退出而不等待其他线程的话我们可以为主线程设置阻塞并设计好阻塞时间以等待其他线程执行完毕。用join()方法使主线程陷入阻塞是实现线程同步的一种方式。参数timeout可以用来设置主线程陷入阻塞的时间
2个都是守护线程
def task(num):print(线程名称, threading.current_thread().name, 参数, num, 开始时间,time.strftime(%Y-%m-%d %H:%M:%S))thread01 Thread(targettask, namet1, daemonTrue, args(6,))
thread02 Thread(targettask, namet2, daemonTrue, args(10,))
if __name__ __main__:print(主线程开始时间, time.strftime(%Y-%m-%d %H:%M:%S))thread01.start()thread02.start()thread01.join(timeout3) # 主线程等待3秒 等待线程1执行完thread02.join(timeout3) # 主线程阻塞3秒 等待线程2执行完 共阻塞6秒 全部执行完毕print(正在运行的线程数量, threading.active_count())print(将当前所有线程的具体信息展示出来, threading.enumerate())print(返回当前线程的信息, threading.current_thread())1个是守护线程
一个子线程设为非守护线程另一个子线程设为守护线程主线程等待3秒后结束看看输出的情况。
def task(num):for i in range(num):print(线程名称, threading.current_thread().name, 参数, num, 开始时间,time.strftime(%Y-%m-%d %H:%M:%S))time.sleep(2)thread01 Thread(targettask, namet1,daemonTrue, args(1,))thread02 Thread(targettask, namet2,args(100,))
if __name__ __main__:print(主线程开始时间, time.strftime(%Y-%m-%d %H:%M:%S))thread01.start()thread02.start()# 主线程等待3秒time.sleep(3)print({} Runing.format(threading.current_thread().name))print(正在运行的线程数量, threading.active_count())print(将当前所有线程的具体信息展示出来, threading.enumerate())print(返回当前线程的信息, threading.current_thread())主线程开始时间 2024-02-12 16:07:05
线程名称 t1 参数 1 开始时间 2024-02-12 16:07:05
线程名称 t2 参数 100 开始时间 2024-02-12 16:07:05
线程名称 t2 参数 100 开始时间 2024-02-12 16:07:07
MainThread Runing
正在运行的线程数量 2
将当前所有线程的具体信息展示出来 [_MainThread(MainThread, started 9624), Thread(t2, started 7112)]
返回当前线程的信息 _MainThread(MainThread, started 9624)
线程名称 t2 参数 100 开始时间 2024-02-12 16:07:09
线程名称 t2 参数 100 开始时间 2024-02-12 16:07:11
线程名称 t2 参数 100 开始时间 2024-02-12 16:07:13守护进程已经执行完了但是非守护进程还在执行程序也就还在执行一旦非守护进程结束会随主线程全部结束。
线程间通信
线程之间共享同一块内存。子线程虽然可以通过指定target来执行一个函数但是这个函数的返回值是没有办法直接传回主线程的。我们使用多线程一般是用于并行执行一些其他任务因此获取子线程的执行结果十分有必要。