招远网站建设公司,设计类平台网站,百度网页下载,泉州seo一、线程进程 对于操作系统来说#xff0c;一个任务就是一个进程#xff08;Process#xff09;#xff0c;比如打开一个浏览器就是启动一个浏览器进程#xff0c;打开一个记事本就启动了一个记事本进程#xff0c;打开两个记事本就启动了两个记事本进程#xff0c…一、线程进程 对于操作系统来说一个任务就是一个进程Process比如打开一个浏览器就是启动一个浏览器进程打开一个记事本就启动了一个记事本进程打开两个记事本就启动了两个记事本进程打开一个Word就启动了一个Word进程。进程是很多资源的集合。 有些进程还不止同时干一件事比如Word它可以同时进行打字、拼写检查、打印等事情。在一个进程内部要同时干多件事就需要同时运行多个“子任务”我们把进程内的这些“子任务”称为线程Thread。 由于每个进程至少要干一件事所以一个进程至少有一个线程。当然像Word这种复杂的进程可以有多个线程多个线程可以同时执行多线程的执行方式和多进程是一样的也是由操作系统在多个线程之间快速切换让每个线程都短暂地交替运行看起来就像同时执行一样。当然真正地同时执行多线程需要多核CPU才可能实现。线程是最小的执行单元而进程由至少一个线程组成。 我们在做事情的时候一个人做是比较慢的如果多个人一起来做的话就比较快了程序也是一样的我们想运行的速度快一点的话就得使用多进程或者多线程在python里面多线程被很多人诟病为什么呢因为Python的解释器使用了GIL的一个叫全局解释器锁它不能利用多核CPU只能运行在一个cpu上面但是你在运行程序的时候看起来好像还是在一起运行的是因为操作系统轮流让各个任务交替执行任务1执行0.01秒切换到任务2任务2执行0.01秒再切换到任务3执行0.01秒……这样反复执行下去。表面上看每个任务都是交替执行的但是由于CPU的执行速度实在是太快了我们感觉就像所有任务都在同时执行一样。这个叫做上下文切换。 二、多线程python中的多线程使用theading模块 下面是一个简单多线程 1 2 3 4 5 6 7 8 9 10 11 12 13 import threading import time def sayhi(num): #定义每个线程要运行的函数 print(running on number:%s %num) time.sleep(3) if __name__ __main__: t1 threading.Thread(targetsayhi,args(1,)) #生成一个线程实例 t2 threading.Thread(targetsayhi,args(2,)) #生成另一个线程实例 t1.start() #启动线程 t2.start() #启动另一个线程 下面是另一种启动多线程的方式继承式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import threading import time class MyThread(threading.Thread): def __init__(self,num): threading.Thread.__init__(self) self.num num def run(self):#定义每个线程要运行的函数 print(running on number:%s %self.num) time.sleep(3) if __name__ __main__: t1 MyThread(1) t2 MyThread(2) t1.start() t2.start() 这两种方式没有什么区别两种写法而已我个人喜欢用第一种更简单一些。 线程等待多线程在运行的时候每个线程都是独立运行的不受其他的线程干扰如果想在哪个线程运行完之后再做其他操作的话就得等待它完成那怎么等待呢使用join等待线程结束 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import threading import time def run(): print(qqq) time.sleep(1) print(done!) lis [] for i in range(5): t threading.Thread(targetrun) lis.append(t) t.start() for t in lis: t.join() print(over) 守护线程什么是守护线程呢就相当于你是一个国王非守护线程然后你有很多仆人守护线程这些仆人都是为你服务的一但你死了那么你的仆人都给你陪葬。 1 2 3 4 5 6 7 8 9 10 11 import threading import time def run(): print(qqq) time.sleep(1) print(done!) for i in range(5): t threading.Thread(targetrun) t.setDaemon(True) t.start() print(over) 线程锁线程锁就是很多线程一起在操作一个数据的时候可能会有问题就要把这个数据加个锁同一时间只能有一个线程操作这个数据。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import threading from threading import Lock num 0 lock Lock()#申请一把锁 def run(): global num lock.acquire()#加锁 num1 lock.release()#解锁 lis [] for i in range(5): t threading.Thread(targetrun) t.start() lis.append(t) for t in lis: t.join() print(over,num) 下面来个简单的爬虫看下多线程的效果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import threading import requests,time urls { baidu:http://www.baidu.com, blog:http://www.nnzhp.cn, besttest:http://www.besttest.cn, taobao:http://www.taobao.com, jd:http://www.jd.com, } def run(name,url): res requests.get(url) with open(name.html,w,encodingres.encoding) as fw: fw.write(res.text) start_time time.time() lis [] for url in urls: t threading.Thread(targetrun,args(url,urls[url])) t.start() lis.append(t) for t in lis: t.join() end_time time.time() print(run time is %s%(end_time-start_time)) #下面是单线程的执行时间 # start_time time.time() # for url in urls: # run(url,urls[url]) # end_time time.time() # print(run time is %s%(end_time-start_time)) 三、多进程上面说了Python里面的多线程是不能利用多核CPU的如果想利用多核CPU的话就得使用多进程python中多进程使用multiprocessing模块。 1 2 3 4 5 6 7 8 from multiprocessing import Process import time def f(name): time.sleep(2) print(hello, name) p Process(targetf, args(niu,)) p.start() p.join() 转载于:https://www.cnblogs.com/chunyanxu/p/8732576.html