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

posted @ 2020-03-29 12:05  广深-小龙  阅读(179)  评论(0编辑  收藏  举报