首页 > 编程语言 > 详细

python_多线程

时间:2021-09-04 05:19:05      阅读:24      评论:0      收藏:0      [点我收藏+]

为什么使用多线程?

1.进程之间不能共享内存,但是线程之间可以共享内存

2.创建进程需要重新分配内存,但是创建线程代价很小

3.python内置多线程模块

 

Threading模块

1.自定义线程

本质:继承threading.Thread,重构thread中的run方法

2.守护线程

setDaemon(True),把所有的子线程都变成了主线程的守护线程,意思是主进程结束,子线程就会直接强制结束

3.主线程等待子线程结束

为了让守护线程结束之后,主程序再结束,我们使用join方法,让主线程等待子线程执行

import threading
import time

def run(n):
    print("task", n)
    time.sleep(1)       #此时子线程停1s
    print(3)
    time.sleep(1)
    print(2)
    time.sleep(1)
    print(1)

if __name__ == __main__:
    t = threading.Thread(target=run, args=("t1",))
    t.setDaemon(True)   #把子进程设置为守护线程,必须在start()之前设置
    t.start()
    t.join() # 设置主线程等待子线程结束
    print("end")

----------------------------------

>>> task t1
>>> 3
>>> 2
>>> 1
>>> end

--global设定变量为全局变量,函数中修改变量改变全局

4.多线程共享全局变量

线程是进程的执行单元,进程是系统分配资源的最小单位,所以同一个进程中的多线程是共享资源的

import threading
import time

g_num = 100

def work1():
    global g_num
    for i in range(3):
        g_num += 1
    print("in work1 g_num is : %d" % g_num)

def work2():
    global g_num
    print("in work2 g_num is : %d" % g_num)

if __name__ == __main__:
    t1 = threading.Thread(target=work1)
    t1.start()
    time.sleep(1)
    t2 = threading.Thread(target=work2)
    t2.start()

----------------------------------

>>> in work1 g_num is : 103
>>> in work2 g_num is : 103

可以看到线程2是直接拿线程1的g_num直接使用的,可以看出线程之间共享了变量

5.互斥锁(lock)

由于线程是随机调用的,所以多个线程修改一个数据时,会出现脏数据。

线程锁可以锁定资源,这样就可以就避免多个操作对一个数据,资源就是变量

6.信号量

互斥锁只允许一个操作修改数据,信号量允许多个线程去修改数据

7.事件(event类)

 

python_多线程

原文:https://www.cnblogs.com/lzwhehe/p/15221065.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!