python24、线程的使用

进程:要加载到内存运行的程序,python的程序里可以开多个程序,就是开了多个进程

线程:属于进程的一部分,一个进程可以有多个线程,属于进程的下属级别

协程:属于最小的单位,比线程还小,可以在线程分支也可以在线程分支
协程耗资源最小
都是并发的(同时执行多个)

线程:处于中间级别,性能良好
Python通过两个标准库_thread 和threading
提供对线程的支持 , threading对_thread进行了封装。_thread就成了threading中的同类且是一部分,是他的类对象继承了他方法等,
因此在实际的使用中我们一般都是使用threading
threading模块中提供了Thread , Lock , RLock , Condition等组件类似于logging
threading模块:
可以实现多线程,其中又分主线程和子线程
threading.Thread(target参数)执行会进行start然后run再对参数
这里就是threading中的Thread类,没输入方法就运用了start和run方法
启动线程才真正创建成功,启动后持续执行,开多个线程能增加执行重复任务的效率
用while循环创建多个线程t1,t2。。。。。来提高效率,
只打印循环的内容,可以不用设参数只需在创建线程时写入target等函数(函数就是方法)到括号就行
启动线程时,start接着启动run,如果没重构run是不会
参数的括号里面的引号的后面必须加逗号才是元组,不然会以字符串形式输入,只能输入元组,即使是数值也要在后面加逗号,如args=n,
两种方式操作多线程:
实例化方式:
实例Thread类
继承方式:
重写run:
继承继承Thread类,name输入就用输入的,没有就用super继承父类的name
不重写run,只会执行print的内容,其他都不执行

线程对象.jion()等到子线程全部结束才开始执行主线程最后一个任务,设置在start后进行
线程对象.setDaemon()守护模式,同生共死模式(主线程关子线程也提前跟着关),直接影响主线程,设置在start前进行,参数Ture表示开启
可以在创建线程的括号里加入,为daemon=True
一般没加守护模式,主线程执行完所有任务也会等子线程结束才关闭,但是加了守护模式不等子线程,主线程执行完所有任务就直接关
主线程关闭后,子线程即使没执行完也不会再进行任务了,通过关闭主线程直接关闭多个子线程的快捷方式
target加执行的目标函数(这个目标函数是主线程主要的活动方式)继承父类不会复刻run,
因为run是留给操作者自行设立的线程活动方法,执行过程全靠子线程操作

线程间的通信:在同一个文件里通信
线程与线程间进行通信
全局变量的共享内存间存在竞争问题,可能一下子进行几百次加才开始减或减再加,加未完成就赋值给减了,
赋值也是共享的,所以进行次数越少加1和减1抵消为0,但是进行次数多了就会得出不确定的数
Lock也是一个模块,导出后可以控制共享间的竞争,
实例化给a后,a.acquire()上锁,加上共享量的变化值,再加上a.release()解锁,把变量所在中间
用with a:加在共享量变化值前一行也可以上锁,这种方式比较简洁
加锁后次数多了会变慢,因为要执行完才能进行下一轮,轮数多了就慢

队列操作:(有入有出按顺序)
导入import queue(queue是一个包 Queue是当中的一个方法)
实例化:queue.Queue()
使用方法:queue.Queue.put(参数),queue.Queue.get(参数),输入多少就输出多少,不会输出更多,执行多输出会造成堵塞终端
power shell两个窗口其中一个输入另一个输出不了,不互通,但Linux开两个窗口可以

线程池:
没开线程池的主线程执行完任务后关闭,等到有任务了又要重新开,频繁开关,开关过程慢,完成一个停一次,完成多个中间停多次
有线程池就不用重新开,直接把任务交给线程池就行了,等线程池有空立马分配任务,主线程只提交不执行,线程池持续工作效率更高
worker获取数据死循环的函数,任务结束: task_done()
apply_async提交任务
for循环的n为生成数量n个线程池
线程池可以放入一个带参数的函数赋值变量体
__init__中的self为实例化对象,用Queue方法赋值得self.实例名(用queue实例名不是模块),
n仍为实例化对象的属性,这里指数量,建立线程池类不用带括号,输入时加括号就会自动匹配进去,pool=Threadpool(4)

自带的内置线程池:
from multiporcessin.pool import Threadpool调用内置线程池
这里的jion前必须要close关闭提交任务
jion等待子线程操作完所有任务就可以执行任务结束
内置线程池拿来用就不用直接建类的结构了,直接输入apply_async提交任务就行,输入执行的函数要自己构造

自建的线程池就是先建线程池的类的构架,然后输入任务,和内置的差了构架的步骤
变量.terminate()可以直接中止

pool.apply_async()
pool.stop()
pool.join()
map放在进程池里并行(并行就是同时一起计算多个)计算,这个语句是阻塞的,apply_async单个函数放进池里计算非阻塞的。join是阻塞到所有apply_async产生的进程执行结束

在调用结果返回前,当前线程会被挂起,并在得到结果之后返回。非阻塞时,如果不能立刻得到结果,则该调用者不会阻塞当前线程。

并发:交替做不同事的能力
并行:同时做不同事的能力

猜你喜欢

转载自blog.csdn.net/qwe863226687/article/details/114015554