美文网首页
Python学习——多线程操作

Python学习——多线程操作

作者: 阿猫阿狗py | 来源:发表于2018-08-23 19:03 被阅读17次

    多进程、多线程操作

    线程和进程对比:

    一个进程可以有多个线程,但是至少有一个主线程

    一个线程只能属于一个进程

    一个进程中多个线程,可以共享进程中提供的数据

    CPU运算分配给线程,CPU上执行运算的是线程

    线程时最小的运行单元,晋城市最小的资源管理单元

    串行:按照执行步骤顺序执行

    image.png

    并行:同时执行多个任务

    image.png

    并发:同时收到多个任务,同时执行多个任务。但是具体到某一刻,只是在执行一个任务。

    image.png

    (1) _thread多线程操作,较为底层

    通过_thread函数启动两个线程完成多线程并发操作

    导入模块

    Import _thread

    启动进程

    _thread.start_new_thread(函数,())

    获取线程编号

    _thread.get_ident()

    注意:让子线程执行结束,需要让主线程休眠

    (2) threading多线程操作,使用较为普遍

    导入模块

    Import threading

    线程启动

    t1 = threading.Thread(name=" ",target=函数名)

    获取当前存货的所有进程

    a) threading.active_count()

    b) t = threading.activeCount()

    print(t)

    获取当前线程对象

    threading.current_thread()

    获取当前线程对象名称

    threading.current_thread().getName()

    获取当前线程对象编号

    threading.get_ident()

    获取主线程

    threading.main_thread() #获取线程名称与编号操作与获取当前线程一样

    (3) 线程锁操作[互斥锁|可重用锁]

    a) 互斥锁

    定义互斥锁对象

    lock = threading.Lock()

    加锁

    lock.acquire() #常用if进行判断即:if lock.acquire():

    互斥锁的主要作用是,当一个进程在对数据进行操作时,不让其他进程造成干扰。加上互斥锁后,当一个进程对数据进行操作时,其他进程不能再操作数据,只能等上一个进程操作完毕后,下一个进程才能进行操作。

    解锁

    lock.release()

    注意:在进行加锁后要记得解锁,否则程序可能死锁,不再继续运行

    死锁:可·······尝试·使用可重用锁

    b) 可重用锁

    i. 使用时只操作一个

    (4)线程状态-daemon

    daemon的主要作用是守护线程。

    在Python中daemon默认为False,当主进程结束时,子线程继续执行。如果想让主线程结束时子线程跟着结束,则需要将daemon改为True

    用法:-》进程名.daemon = False/True

    (5)join独占属性:让当前线程独占CPU时间片,直到当前线 程运行结束/超时

    进程名.join()

    (6)两个线程之间的相互通信

    #线程通信-事件对象

    event = threading.Event()

    event.set()添加标记

    event.wait()线程等待

    event.clear()清除标记

    image.png

    线程通信­-条件对象

    定义条件对象

    con = threading.Condition()

    con.acquire()上锁

    con.release()解锁

    con.wait()等待

    con.notify()唤醒

    公共数据的处理:生产者、消费者问题

    公共的数据[篮子]

    生产者:蒸包子-> 放到篮子中:并且告诉[唤醒]所有消费者可以吃了

    如果篮子满了,所有 生产者 等待

    消费者:吃包子-> 从篮子中获取数据,并且告诉[唤醒]所有生产者继续蒸包子

    如果篮子空了,所有 消费者 等待

    #线程通信-队列

    创建一个队列,存储数据

    basket = queue.Queue(10)

    put(data [, timeout=None])

    向队列中添加数据,如果队列已满~一直等待[到超时]

    get([timeout=None])

    从队列中获取数据,如果队列已空~一直等待[到超时]

    特性:线程安全!

    相关文章

      网友评论

          本文标题:Python学习——多线程操作

          本文链接:https://www.haomeiwen.com/subject/iirzbftx.html