线程与线程通信

  • 线程

什么是线程
    线程是一种多任务编程方法,可以利用计算机多核资源完成程序的并发执行,线程又被称为轻量级的进程
线程特征
    *线程是计算机多核分配的最小单位
    *一个进程可以包含多个线程
    *线程也是一个运行的过程,消耗计算机资源,多个线程共享进程的资源和空间
    *线程的创建删除消耗的资源都要远远小于进程
    *多个进程之间执行互不干扰
    *线程也有自己的特有属性,比如指令级 ID

threading 模块创建线程

threading.Thread()
    功能:创建线程对象
    参数:name 线程名称  默认为Thread-1
        target 线程函数
        args  元组  给线程函数位置传参
        kwargs 字典 给线程函数键值传参

t.start() 启动线程  自动运行线程函数
t.join([timeout]) 回收线程


线程对象属性

    t.is_alive()  查看线程状态
    t.name()  线程名称
    t.setName() 设置线程名称
    t.getName() 获取线程名称
    threading.currentThread()  获取当年线程对象

t.daemon属性

    默认情况下主线程退出不会影响分支线程执行
    如果设置为True 则分支线程随主线程退出

    设置方法:
    t.daenon = True
    t.setDaemon(True)

    判断属性值
    t.isDaemon


创建自己的线程类
    步骤:
    1. 继承Thread
    2. 加载Thread中的__init__
    3. 重写run方法

# mythread.py
from threading import Thread
from time import sleep, ctime

class myTread(Thread):
    def __init__(self, func , args = [], kwargs = {}):
        super().__init__()
        self.kwargs = kwargs
        self.func = func 
        self.args = args
    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 =Thread(target = myTread.run, args = ('凉凉',),\
         kwargs = {'sec' : 2})
t.start()
t.join()

线程通信
    
    通信方法:多个线程共享的空间,所以线程间通信使用全局变量来完成

    注意事项:线程间使用全局变量往往要同步互斥机制保证通信安全

    线程的同步互斥方法
        线程的event
            e = threading.Event() 创建事件对象
            e.wait([timeout])  如果e为设置状态则不阻塞否则阻塞
            e.set()将e变为设置状态
            e.clear()清除设置

    线程锁
        lock = threading.lock() # 创建锁对象
        lock.acquire()    上锁
        lock.release()    解锁
        *也可以通过with 上锁 ,上锁状态调用acquire会阻塞


    python 线程的GIT问题 (全局解释器锁)   

    python--->支持多线程-->同步和互斥-->加锁-->超级锁,给解释器加锁
    -->解释器同一时刻只能解释一个线程


    后果:一个解释器同一时刻只能解释执行一个线程,所以导致python线程效率地下,
        但是当遇到IO阻塞时,线程会主动让出解释器,因此python线程更加适合高
        延迟的IO程序线程

    解决方法
        *尽量用进程完成并发
        *不使用c解释器 c# java
        *尽量使用多种方案组合的方法进行并发操作,线程用作高延迟IO

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值