线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作的基本单位。 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。每个进程至少有一个线程,而这个线程叫做主线程。
1)、导入线程模块(threading)
2)、创建子线程(.Thread)
Thread(group=None, target=None, name=None, args=(), kwargs={})
group: 线程组,目前还没有实现,库引用中提示必须是None;
target: 要执行的方法;
name: 线程名;
args/kwargs: 要传入方法的参数。
3)、启动子线程(.start)
'''
1、导入线程模块(threading)
2、创建子线程(.Thread)
3、启动子线程(.start)
'''
import threading
import time
def sing():
for i in range(3):
print('sing......')
time.sleep(0.2)
def dance():
for i in range(3):
print('dance......')
time.sleep(0.2)
def show(name,age):
print('name:{},age{}'.format(name,age))
if __name__ == '__main__':
sing_thread = threading.Thread(target=sing)
dance_thread = threading.Thread(target=dance)
sing_thread.start()
dance_thread.start()
#以元组形式传参
turtle_thread=threading.Thread(target=show,args=('张三',18))
#以字典形式传参
key_thread=threading.Thread(target=show,kwargs={'name':'张三','age':20})
#元组,字典混合形式传参
turtle_key_thread=threading.Thread(target=show,args=('张三',),kwargs={'age':22})
turtle_thread.start()
key_thread.start()
turtle_key_thread.start()
1)、线程之间执行是无序的。
2)、主线程会等待所有子线程执行结束再结束。
3)、线程之间共享全局变量。
线程同步,线程间协同,通过某种计数,让一个线程访问某些数据时,其他线程不能访问这些数据,直到该线程完成对数据的操作。
线程同步的方式:
1)、线程等待(.join)
2)、互斥锁(Lock)
import threading
gnum=0
def add1():
global gnum
for i in range(1000000):
gnum=gnum+1
print('add1',gnum)
def add2():
global gnum
for i in range(1000000):
gnum=gnum+1
print('add2',gnum)
if __name__ == '__main__':
first_thread=threading.Thread(target=add1)
second_thread=threading.Thread(target=add2)
first_thread.start()
#线程等待,让第一个线程先执行,然后在执行第二个进程
first_thread.join()#主线程等待第一个子线程执行完成后,后面的代码才会执行
second_thread.start()
import threading
gnum=0
#创建互斥锁,Lock本质上是一个函数,通过调用函数可以创建一个互斥锁
lock_gnum=threading.Lock()
def add1():
#上锁
lock_gnum.acquire()
global gnum
for i in range(1000000):
gnum=gnum+1
print('add1',gnum)
#释放锁
lock_gnum.release()
def add2():
#上锁
lock_gnum.acquire()
global gnum
for i in range(1000000):
gnum=gnum+1
print('add2',gnum)
#释放锁
lock_gnum.release()
if __name__ == '__main__':
first_thread=threading.Thread(target=add1)
second_thread=threading.Thread(target=add2)
first_thread.start()
second_thread.start()