t013b9c86f5a43c0037.jpg
多线程目的:
- 解决效率问题,我们平时写的代码,大多可以理解为单线程执行,即顺序执行,一个流程执行完成后,再执行另外一个流程,而多线程是一种并发技术,也就是说多程序同时或者极短的时间内来回切换运行。
多线程基础
- threading.Thread()方法创建线程。
import threading
import time
def run(name):
print(name,'执行线程')
time.sleep(5)
#创建线程对象
t1=threading.Thread(target=run,args=("t1",))
t2=threading.Thread(target=run,args=("t2",))
#启动线程
t1.start()
t2.start()
#等待子线程执行完毕后再执行主线程之后的内容
t1.join()
t2.join()
print('执行完毕')
结果:
t1 执行线程
t2 执行线程
执行完毕
创建线程类
- 我们在实际运用中,更多的是采用自定义的多线程,也就是创建线程类,继承threading模块。
import threading
import time
class Myspider(threading.Thread):
def __init__(self,name):
threading.Thread.__init__(self)
self.name=name
def run(self):
print("开始线程"+self.name)
print('线程执行中111111')
time.sleep(1)
print('线程执行中222222')
time.sleep(1)
print('线程执行中333333')
time.sleep(1)
print('线程执行中444444')
time.sleep(1)
print('线程执行中555555')
time.sleep(1)
#创建线程
t1=Myspider("t1")
t2=Myspider("t2")
t3=Myspider("t3")
#开始线程
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
print("执行完了")
结果:由于没有加线程锁,所以会有混乱的情况出现。
开始线程t1
开始线程t2线程执行中111111
线程执行中111111
开始线程t3
线程执行中111111
线程执行中222222
线程执行中222222
线程执行中222222
线程执行中333333线程执行中333333
线程执行中333333
线程执行中444444
线程执行中444444
线程执行中444444
线程执行中555555
线程执行中555555
线程执行中555555
执行完了
队列使用
- Queue为多线程提供一种先进先出的方法,相当于工厂中的生产调度,对计划任务进行有序的安排执行。
- maxsize=10 允许队列的最大线程。
import queue
q=queue.Queue(maxsize=10)
for i in range(1,11):
q.put(i)#向队列中放值
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
while not q.empty():#如果线程不为空,则执行。
print(q.get())
结果:
1
2
3
4
5
6
7
8
9
10