人工智能(PythonNet)—— 多任务编程之线程

一、线程

        线程也是一种多任务编程的方式,可以使用计算机多核资源。线程又被称为轻量级的进程。

        线程特征
                * 线程是计算机核心分配的最小单位
                * 一个进程可以包含多个线程
                * 线程也是一个运行过程,也要消耗计算机资源。多个线程共享其进程的资源和空间
                * 线程也拥有自己特有的资源属性,比如指令集,TID等
                * 线程无论创建还是删除还是运行资源消耗都小于进程
                * 多个线程之间并行执行,互不干扰

        应用场景 :
                * 需要创建较多的并发,任务比较简单,线程比较合适。
                * 如果程序见数据资源使用重叠比较多,要考虑到线程锁是否需要更复杂的逻辑
                * 如果多个任务并无什么关联性,不易用多线程将其融入到一个进程中
                * python线程不适用于计算密集型并发

        import threading

二、线程的函数和属性

        t = threading.Thread()
        功能 : 创建线程对象
        参数 : name   线程名称
                        target 线程函数
                        args   元组   给线程函数传参
                        kwargs 字典   给线程函数传参

        t.start()                    启动线程
        t.join([timeout])        回收线程
 
        t.is_alive()   查看线程状态
        t.name   线程名称  默认Thread-1 。。。。。
        t.setName()  设置线程名称
        threading.currentThread()  获取当前线程对象

        t.daemon
                默认情况下,主线的结束不会影响分支线程
                如果设置为True 则主线程退出分支线程也会退出
                设置方法:
                        t.daemon = True
                        t.setDaemon(True)
                判断daemon属性:
                        t.isDaemon()
                说明:
                        线程daemon属性的设置在start前
                        一般设置daemon后不会在使用join

三、创建自己的线程类

        a、继承Thread类
        b、运行Thread类中的__init__方法以获取父类属性
        c、重写run方法

四、补充

threadpool 第三方库,线程池应用较少,用的最多的是进程池。

python线程之GIL(全局解释器锁):python  ---》 支持多线程 ---》同步互斥 ---》加锁 ---》 超级锁 ----》 在同一时刻,解释器只能解释一个线程 -----》大量python库为了省事沿用了这种方法 ---》python 多线程效率低下

GIL 问题 : 由于python的全局解释器锁造成python的多线程执行效率低下

五、示例

1、基础

import threading 
from time import sleep 
import os 

a = 1

#线程函数
def music():
    global a 
    a = 10000
    for i in range(5):
        sleep(2)
        print("播放葫芦娃",os.getpid())

#创建线程对象
t = threading.Thread(target = music)

t.start()

for i in range(5):
    sleep(1.5)
    print("想听扶摇",os.getpid())

t.join()
print("a = ",a)

2、属性

from threading import Thread,currentThread
from time import sleep 

#线程函数
def fun(sec):
    print("线程属性测试")
    sleep(sec)
    #获取线程对象 getName()获取名字
    print("%s 线程结束"%currentThread().getName())

thread = []

for i in range(3):
    t = Thread(target = fun,name = "tedu%d"%i,\
        args = (3,))
    thread.append(t)
    t.start()
    print(t.is_alive())  #查看进程状态

thread[1].setName('Tarena')  #设置线程名称
print(thread[2].name) #获取线程名称

#回收线程
for i in thread:
    i.join()

3、daemon

#daemon属性
from threading import Thread
from time import sleep 

def fun():
    print("Daemon 属性测试")
    sleep(5)
    print("线程结束")

t = Thread(target = fun)

#为线程设置名字
t.setName("tedu")

#daemon属性设置为True
#t.daemon = True
t.setDaemon(True)
print(t.isDaemon())

t.start()
t.join(2)
print("=====主线程结束======")

4、重写

from threading import Thread 
from time import ctime,sleep 

#创建自己的线程类
class MyThread(Thread):
    def __init__(self,target,\
        name = "Tedu",args = (),kwargs = {}):
        super().__init__() 
        self.name = name
        self.target = target
        self.args = args
        self.kwargs = kwargs

    def run(self):
        self.target(*self.args,**self.kwargs)


#线程事件
def player(song,sec):
    for i in range(2):
        print("Playing %s : %s"%(song,ctime()))
        sleep(sec)

t = MyThread(target = player,args = ('凉凉',3))

#自动执行run()
t.start()
t.join()

八、附录:目录

        人工智能(PythonNet)—— 目录汇总

猜你喜欢

转载自blog.csdn.net/qq_27297393/article/details/81088511
今日推荐