python多线程

1、线程的概念

线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作的基本单位。 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。每个进程至少有一个线程,而这个线程叫做主线程。

2、多线程的使用

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()

3、线程的注意点

1)、线程之间执行是无序的。
2)、主线程会等待所有子线程执行结束再结束。
3)、线程之间共享全局变量。

4、线程同步

线程同步,线程间协同,通过某种计数,让一个线程访问某些数据时,其他线程不能访问这些数据,直到该线程完成对数据的操作。
线程同步的方式:
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()

你可能感兴趣的:(python,开发语言)