python-46-多线程

前言

线程:单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位,代码/数据/文件是共享的。

就好像看作一个进程中还有多个线程执行任务,简单点来说就是一个程序运行中有多个线程在执行。

一、初识多线程

1、函数中多线程:

# 初识多线程:threading
from threading import Thread
import time
def func(i):
    time.sleep(2)
    print(i)

if __name__ == '__main__':
    for i in range(5):
        thread=Thread(target=func,args=(i,))
        thread.start()

 2、类中多线程:

# 2、类中多线程
from threading import Thread
import time
class MyTread(Thread):
    def __init__(self,i):
        super().__init__()
        self.i=i
    def run(self):          # 必须有run方法
        time.sleep(1)
        print(self.i)

for i in range(10):
    t=MyTread(i)
    t.start()

线程pid是一样的:

 3、代码/数据/文件是共享的:

 但变量计算中会可能会同时拿到变量导致数据不安全,但可以加锁(GIL锁)

 实例:

# 3、代码/数据/文件是共享的实例
from threading import Thread
import time
num=10                      # 定义一个全局变量
class MyTread(Thread):
    def __init__(self,i):
        super().__init__()
        self.i=i
    def run(self):          # 必须有run方法
        global num          # global声明变量
        time.sleep(1)
        print('线程:',self.i+num) # i+num
for i in range(10):
    t=MyTread(i)
    t.start()

4、多线程与多进程效率对比,同是100个。

明显多线程更胜一筹,毋庸置疑。

# 4、多线程与多进程效率对比,同是100个。
from threading import Thread
import time
from multiprocessing import Process
def func(i):
    return i+i
if __name__ == '__main__':
    start=time.time()
    t_lst=[]
    for i in range(100):
        t=Thread(target=func,args=(i,))     # 多线程
        t.start()
        t_lst.append(t)
    for i in t_lst:i.join()
    t1=time.time()-start
    print('多线程执行时间:',t1)

    start=time.time()
    p_lst=[]
    for i in range(100):
        p=Process(target=func,args=(i,))    # 多进程
        p.start()
        t_lst.append(p)
    for i in p_lst:i.join()
    t2=time.time()-start
    print('多进程执行时间:',t2)

 二、threading 其它方法

  • current_thread:查看线程名字与id
  • get_ident:查看线程id
  • active_count:查看活跃线程数(注意要加上主线程)
  • enumerate:查看线程所有项(len就得到活跃线程数)

1、threading模块其它方法:

# threading模块其它方法
import threading,time
def func(i):
    time.sleep(0.5)
    print(i,threading.current_thread())     # 查看线程名字与id
    print(i,threading.get_ident())          # 查看线程id

for i in range(5):
    threading.Thread(target=func,args=(i,)).start()
print(threading.active_count())             # 查看活跃线程数(注意要加上主线程)
print(threading.enumerate())                # 查看线程所有项
print(threading.current_thread())           # 查看线程名字与id

小结:

  • 进程是最小的内存分配单位,线程是操作系统调度的最小单位
  • 线程直接被CPU执行,进程内至少含有一个线程,也可以开启多个线程
  • 开启一个线程所需要的时间要远远小于开启一个进程
  • 多个线程内部有自己的数据栈,数据不共享,但代码/数据/文件是共享的
  • 全局变量在多个线程之间是共享的,但会导致数据不安全,需加锁

欢迎来大家QQ交流群一起学习:482713805

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

姚二龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值