添加线程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}")