多线程讲解+ Python thread实战操作

哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮

有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。

一、 前言

1. 什么是线程

线程(Thread)也被称为轻量级进程,是操作系统能够进行调度的最小单位,它被包含在进行中,是进程中的实际运作单位。线程本身不拥有系统资源,但是与同进程中的其他线程共享进程资源。

一个进程中的多个线程可以创建和kill另一个线程,同一个进程中的多个线程之间可以并发执行。

2. 进程与线程

进程是资源分配的最小单位,一个程序至少有一个进程。
线程称程序执行的最小单位,一个进程至少有一个线程。

进程都有自己的独立地址空间、内存、数据栈等,所以进程占用资源多。由于进程的资源独立,通信不方便,故而进程间使用IPC通讯

一个进程中可以存在多个线程,在单核CPU中每隔进程中同时只能运行一个线程,所以只有在多核CPU中在能实现多线程并发

3. 为什么要用多线程

线程在程序中是独立,并且并发的执行流。与进程相比,进程中线程之间的隔离程度要小,其可以共享内存、文件句柄等。

线程的划分尺度小于进程,使得多线程的并发性要高。而进程在执行的过程中,系统会为其分配独立的内存单元,而线程内存共享,故而效率极大地得到了提升。

线程

二、 Python 多线程

1. 线程间等待 join

from time import sleep
from threading import Thread
import threading

# 小明要下载10个视频
tasks = ['move1','movie2','movie3','movie4','movie5','movie6']

def download(movie):
    # print(f'开始下载{movie}')
    sleep(2)
    print(f'完成下载{movie}')

threads = []
for task in tasks:
    t = Thread(target=download, name=task,args=(task,))
    t.start()   # 启动线程
    threads.append(t)

for t in threads:
    t.join()    # 当前线程等待线程 t 执行完成后再执行后面的代码

print(threading.current_thread())
print('完成')

2. 其他

from time import sleep
from threading import Thread
import threading

# 小明要下载10个视频
tasks = ['move1','movie2','movie3','movie4','movie5','movie6']

def download(movie):
    # print(f'开始下载{movie}')
    sleep(2)
    # print(f'完成下载{movie}')

for task in tasks:
    # 创建线程
    # daemon :守护线程---当主线程执行完成后,马上终止当前的任务,不管是否完成。
    t = Thread(target=download, name=task,args=(task,))
    t.start()       # 启动线程
    print(f'{t.name},{t.ident},{t.is_alive()},{t.daemon}')


print(threading.current_thread())
print('完成')

3. 完整

import threading
import time

from queue import Queue

def job(l,q):
    for i in range (len(l)):
        l[i] = l[i]**2
    q.put(l)

def multithreading():
    q =Queue()
    threads = []
    data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]]
    for i in range(4):
        t = threading.Thread(target=job,args=(data[i],q))
        t.start()
        threads.append(t)
    for thread in threads:
        thread.join()

    results = []
    for _ in range(4):
        results.append(q.get())
    print(results)

if __name__=='__main__':
    multithreading()

4. 需求:主线程跑的时候,再开启个子线程,无需子线程的结果,相互独立


import threading, time

def T1():
    time.sleep(3)
    print(666)

def main():
    # 添加线程
    thread = threading.Thread(target=T1, name='T1')
    thread.start()

    print(123)
    return '6'

if __name__ == '__main__':
    main()

参考:
https://blog.csdn.net/qq_16481211/article/details/80950979

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有勇气的牛排

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值