添加线程Thread
导入模块
只要导入threading库就可以用多线程了
>>> import threading
获取已激活的线程数
>>> threading.active_count()
查看线程信息
>>> threading.enumerate()
查看正在运行的线程
>>> threading.current_thread()
添加线程
需要在threading.Thread()中加入参数target来代表参数需要进行的任务
#python3
import threading
def task():
print('start')
def main():
th1 = threading.Thread(target=task,args=(i,)) #定义线程,传入参数i
th1.start() # 让线程开始工作
if __name__=='__main__':
main()
Thread里的target参数代表了要执行的任务,而args参数是一个数组变量参数,如果target方法需要参数传入,就需要args参数来传递进去。
args参数传入时候一定要是一个数组,所以逗号必不可少
实现线程的另一种方法
我们可以写一个类来完成线程的运行。
一个例子:
import threading
import time
class MyThread(threading.Thread):
def run(self):
for i in range(3):
time.sleep(1)
print(self.name) # name属性中保存的是当前线程的名字
if __name__ == '__main__':
t = MyThread()
t.start
join功能
基本概念
join()方法是表示等这个线程运行完毕,程序再往下运行。
实例
#python3
import threading
def task():
print('start')
def main():
th1 = threading.Thread(target=task) #定义线程
th1.start()
th1.join()
print('fi')
if __name__=='__main__':
main()
上面的代码就是th1运行结束之后,在去打印'fi'。
任务队列--queue
简介
Queue用于建立和操作队列,常和threading类一起用来建立一个简单的线程队列。
引入queue
>>> import queue
>>> q= queue.Queue(2) # 允许队列的最大长度
put方法
>>> q.qut(a) # 向队列传入a元素
>>> q.put(b)
>>> q.put(c,block=False) # 默认block参数为True,设置block为false后,如果再次传入值会报错
>>> q.put(d,timeout=2) # 设置阻塞时间最多等待2秒,等待结束值还无法进入队列则报错
get方法
踢出put进来的元素
>>> q.get()
>>> q.get(block=False) # 设置block为False,获取不到值的时候不阻塞,报错
>>> q.get(timeout=1) # 设置获取队列时间为1秒,超时则报错
empty方法
>>> q.empty() # 判断队列是否为空,为空则为真
队列元素长度
>>> q.qsize() # 显示处队列中拥有值的个数
task_done方法
一般要配合join方法使用
>>> q.task_done() # 告诉队列,值被取完了
join方法
>>> q.join() # 当队列里还有值是会报错,队列里为空的时候则成功执行
四种队列
# python 四种队列
# queue.Queue 先进先出队列
# queue.LifoQueue 后进先出队列
# queue.PriorityQueue 优先级队列
# queue.deque 双向队列
具体使用百度
线程锁--Lock
简介
不同线程对同一个资源进行修改或利用时会出现混乱,所以需要线程锁。
初始化锁对象
>>> lock = threading.Lock()
锁定
>>> lock.acquire(blocking)
blocking参数设定为True,则当前线程会堵塞,直到获取这个锁为止(如妹没有指定.那么默认为True)。
如果设定blocking为False,则当前线程不会堵塞。
释放
>>> lock.release()
例子
from threading import Thread,Lock
g_num = 0
def test1():
global g_num
lock.acquire()
for i in range(10000000):
g_num += 1
lock.release()
print(f'test1-----{g_num}')
def test2():
global g_num
lock.acquire()
for i in range(10000000):
g_num += 1
lock.release()
print(f'test2-----{g_num}')
lock = Lock()
p1 = Thread(target=test1)
p1.start()
p2 = Thread(target=test2)
p2.start()
print(f"main-----{g_num}")