首先需要知道什么是多线程,多线程的作用。
首先举个例子,并发和并行:
并发:并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
并行:并行是指“并排行走”或“同时实行或实施”。在操作系统中是指,一组程序按独立异步的速度执行,不等于时间上的重叠(同一个时刻发生)。
例子:吃一碗米饭和菜。并发:一个人吃,吃完一口米饭再吃一口菜,切换速度快,感觉是同时进行的。并行:两个人吃,一人吃饭一人吃菜,真正的同时进行。
而Python的多线程本质就是并发,听起来是同时进行多个事情,但是微观上是进行一件事情的时间很短,然后在执行另一个事情,只是速度很快,让人看起来是同时进行的。
然后呢,为什么要多线程,Python有多线程和多进程,多协程,多进程就是并行,每一种都有自己适合的用途,比如爬虫,多线程就比多进程要好,但是多线程更复杂一些。例如你有一个网址,需要抓取详情页,在抓取详情页里面的很多内容,这个时候就可以在抓取详情页里的链接后用多线程一起抓取。
这里使用的模块是threading(),没下载的可以在命令行pip install threading
import threading
import time
class mythread(threading.Thread):
def __init__(self,name,ls2):#参数根据自己的需要改变
threading.Thread.__init__(self)#必须有的
self.name=name
self.ls2=ls2
def run(self):#线程运行函数
F1(self.name,self.ls2)#主要函数
先构造一个类,引用父类threading.Thread。
def F1(name,ls2):
time.sleep(2)
print('%s : %s : %s \n' % (name,time.ctime(time.time()),ls2))
上面这些都是多线程的初始设置方面,接下来就是启动和结束线程。
over=[]
#创建url列表
ls=[]
for i in range(30):
ls.append(i)
for i in range(3):
#列表分为三类
ls2=[]
a=len(ls)//3
ls2.append(ls[i*a:i*a+a])
#创建线程,并将分裂的url导入线程
threadtext = mythread('线程'+str(i),ls2)#导入线程初始设置的参数
threadtext.start()#启动线程
over.append(threadtext)#将线程导入接下来结束的列表中
print('当前线程活动数为:'+str(threading.active_count()))
for i in over:
i.join()#线程阻塞,使子线程在主线程结束前一直运行。
print('线程全部结束')
基本上格式就上面的那些,爬虫抓取数据的步骤可以写在一个函数里面,然后在run里面调用。
import time
import threading
class mythread(threading.Thread):
def __init__(self,name,ls2):
threading.Thread.__init__(self)
self.name=name
self.ls2=ls2
def run(self):
shiyan()
F1(self.name,self.ls2)
def F1(name,ls2):
time.sleep(2)
print('%s : %s : %s \n' % (name,time.ctime(time.time()),ls2))
over=[]
#创建url列表
ls=[]
for i in range(30):
ls.append(i)
for i in range(3):
#列表分为三类
ls2=[]
a=len(ls)//3
ls2.append(ls[i*a:i*a+a])
#创建线程,并将分裂的url导入线程
threadtext = mythread('线程'+str(i),ls2)
threadtext.start()
over.append(threadtext)
print('当前线程活动数为:'+str(threading.active_count()))
for i in over:
i.join()
print('线程全部结束')