python多线程
python多线程
什么是多线程
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。
这是维基百科的多线程的的简介,在我看来就是你在做饭的时候有两个灶台可以同时炒菜和煲汤而不是只能先炒菜然后再煲汤。
多线程的优势
多线程可以帮助你较为快速的执行你的代码,提高运行速度,这在做爬虫的时候是一个很方便的东西
开始python的多线程
python的多线程根据我的学习其实还好,但是也有一些缺点,我们主要掌握怎么使用就好。
python的多线程库
python支持多线程而且有两个自带库,分别是 thread 和 threading ,threading相对更加完善和方便使用,所以我们主要就讲述怎么使用threading。当然,作者能力有限而且也只是自己学习笔记而已,如果有什么错误的地方还烦请大家指出。
threading
基础介绍
threading是一个内置库,所以不需要安装只是在使用的时候引入就好。
import threading
我们来看一下threading这个库的常用的函数:
- threading.active_count(),返回当前存活的线程类 Thread 对象。返回的计数等于 enumerate() 返回的列表长度。
- threading.Thread(target=func_name,args = *[]),创建一个新的线程,其中target只是你需要这个线程执行的功能我们将其写在一个函数中,只需要函数名。args则负责传递参数,同时可以使用name变量给进程命名。
说完函数,我们来说一下threading对象。对象也有常见的方法,说一下常见对象的方法:
- start(),开始一个进程
- join(),加入线程
- run(),代表进程活动
- name(),只用于识别的字符串。它没有语义。多个线程可以赋予相同的名称。 初始名称由构造函数设置。
实现
介绍完了基础,我们用代码来实现一下。
import time
def inst1():
print("1start")
time.sleep(1)
print("1end")
def inst2():
print("2start")
print("2end")
if __name__ == '__main__':
thr1 = threading.Thread(target=inst1, name="ins1")
thr1.start()
print("ok")
现在其实就是两个进程,两个进程基本上是同时执行,然后产生的结果会是这样的:
1start
ok
1end
我们还可以生成一个进程来看下,我们就在上面的基础上修改一下就好
thr1 = threading.Thread(target=inst1, name="ins1")
thr1.start()
thr2 = threading.Thread(target=inst2, name="ins2")
thr2.start()
print("ok")
---------
1start
2start
2end
ok
1end
这样的话可以更为直接的看出来多线程的含义,他们会同时执行,但是呢根据执行的时间不相同产生结果的时间也不相同,而且是线程与线程之间是混杂的,如果我们想要让一个线程先执行完成结果后再去下一个应该怎么做呢?就可以用到我们前面写的join()方法了。记住前面没有使用join()方法 的结果,然后看一下后面使用的结果
thr1 = threading.Thread(target=inst1, name="ins1")
thr1.start()
thr1.join()
thr2 = threading.Thread(target=inst2, name="ins2")
thr2.start()
print("ok")
---------------------------------------
1start
1end
2start
ok
2end
你会发现结果是不是不一样了,join主要是用于如果你想所有进程处理完毕后再执行print("ok")下面的语句的话就可以使用到join。join是等待,直到线程终结。这会阻塞调用这个方法的线程,直到被调用 join() 的线程终结不管是正常终结还是抛出未处理异常或者直到发生超时,超时选项是可选的。如果是需要用到的话建议是1221这样V形使用。
基础介绍差不多就这样,后面会讲述如何保存多线程结果的。