0
点赞
收藏
分享

微信扫一扫

springboot+jsp幼儿园综合管理系统1m341

萨科潘 04-10 14:30 阅读 3
python

一、线程的概念

1、线程的概念

在Python中,想要实现多任务还可以使用多线程来完成。

2、为什么使用多线程?

进程是分配资源的最小单位 , 一旦创建一个进程就会分配一定的资源 , 就像跟两个人聊QQ就需要打开两个QQ软件一样是比较浪费资源的 .

线程是<font color="red">程序执行的最小单位</font> , 实际上进程只负责分配资源 , 而利用这些资源执行程序的是线程 , 也就说进程是线程的容器 , 一个进程中最少有一个线程来负责执行程序 。同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程<font color="red">共享进程所拥有的全部资源</font> 。这就像通过一个QQ软件(一个进程)打开两个窗口(两个线程)跟两个人聊天一样 , 实现多任务的同时也节省了资源。

3、多线程的作用

def func_a():
    print('任务A')
​
​
def func_b():
    print('任务B')
​
​
func_a()
func_b()

☆ 单线程执行

☆ 多线程执行

二、多线程完成多任务

1、多线程完成多任务

① 导入线程模块
import threading
​
② 通过线程类创建线程对象
线程对象 = threading.Thread(target=任务名) 
​
② 启动线程执行任务
线程对象.start()
参数名说明
target执行的目标任务名,这里指的是函数名(方法名)
name线程名,一般不用设置
group线程组,目前只能使用None

2、线程创建与启动代码

单线程案例:

import time
​
​
def music():
    for i in range(3):
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding():
    for i in range(3):
        print('敲代码...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    music()
    coding()

多线程案例:

import time
import threading
​
​
def music():
    for i in range(3):
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding():
    for i in range(3):
        print('敲代码...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    music_thread = threading.Thread(target=music)
    coding_thread = threading.Thread(target=coding)
​
    music_thread.start()
    coding_thread.start()

3、线程执行带有参数的任务

参数名说明
args以元组的方式给执行任务传参
kwargs以字典方式给执行任务传参
import time
import threading
​
​
def music(num):
    for i in range(num):
        print('听音乐...')
        time.sleep(0.2)
​
​
def coding(count):
    for i in range(count):
        print('敲代码...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    music_thread = threading.Thread(target=music, args=(3, ))
    coding_thread = threading.Thread(target=coding, kwargs={'count': 3})
​
    music_thread.start()
    coding_thread.start()

4、主线程和子线程的结束顺序

import time
import threading
​
​
def work():
    for i in range(10):
        print('work...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    # 创建子进程
    work_thread = threading.Thread(target=work)
    # 启动线程
    work_thread.start()
​
    # 延时1s
    time.sleep(1)
    print('主线程执行完毕')

☆ 设置守护线程方式一

import time
import threading
​
​
def work():
    for i in range(10):
        print('work...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    # 创建子线程并设置守护主线程
    work_thread = threading.Thread(target=work, daemon=True)
    # 启动线程
    work_thread.start()
​
    # 延时1s
    time.sleep(1)
    print('主线程执行完毕')

☆ 设置守护线程方式二

import time
import threading
​
​
def work():
    for i in range(10):
        print('work...')
        time.sleep(0.2)
​
​
if __name__ == '__main__':
    # 创建子线程
    work_thread = threading.Thread(target=work)
    # 设置守护主线程
    work_thread.setDaemon(True)
    # 启动线程
    work_thread.start()
​
    # 延时1s
    time.sleep(1)
    print('主线程执行完毕')

5、线程间的执行顺序

for i in range(5):
    sub_thread = threading.Thread(target=task)
    sub_thread.start()

思考:当我们在进程中创建了多个线程,其线程之间是如何执行的呢?按顺序执行?一起执行?还是其他的执行方式呢?

答:线程之间的执行是无序的,验证

☆ 获取当前线程信息

# 通过current_thread方法获取线程对象
current_thread = threading.current_thread()
​
# 通过current_thread对象可以知道线程的相关信息,例如被创建的顺序
print(current_thread)

☆ 线程间的执行顺序

import threading
import time
​
def get_info():
    # 可以暂时先不加,查看效果
    time.sleep(0.5)
    current_thread = threading.current_thread()
    print(current_thread)
​
​
if __name__ == '__main__':
    # 创建子线程
    for i in range(10):
        sub_thread = threading.Thread(target=get_info)
        sub_thread.start()

6、线程间共享全局变量

☆ 线程间共享全局变量

多个线程都是在同一个进程中 , 多个线程使用的资源都是<font color="red">同一个进程中的资源</font> ,因此多线程间是共享全局变量

示例代码:

import threading
import time
​
​
my_list = []
​
​
def write_data():
    for i in range(3):
        print('add:', i)
        my_list.append(i)
    print(my_list)
​
​
def read_data():
    print('read:', my_list)
​
​
if __name__ == '__main__':
    write_thread = threading.Thread(target=write_data)
    read_thread = threading.Thread(target=read_data)
​
    write_thread.start()
    time.sleep(1)
    read_thread.start()

7、总结:进程和线程对比

☆ 关系对比

① 线程是依附在进程里面的,没有进程就没有线程。

② 一个进程默认提供一条线程,进程可以创建多个线程。

☆ 区别对比

① 进程之间不共享全局变量

② 线程之间共享全局变量

③ 创建进程的资源开销要比创建线程的资源开销要大

④ 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位

☆ 优缺点对比

① 进程优缺点:

优点:可以用多核

缺点:资源开销大

② 线程优缺点

优点:资源开销小

缺点:不能使用多核

举报

相关推荐

0 条评论