首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python3 - 多线程 - thre

python3 - 多线程 - thre

作者头像
py3study
发布2020-01-13 11:11:00
3990
发布2020-01-13 11:11:00
举报
文章被收录于专栏:python3python3

目录

一、threading 模块:对线程的处理

二、Thread组件

2-1 开启线程的方式一(函数)

2-2 开启线程的方式二 (类)

2-3 Thread 相关内置子方法 

2-4 主进程等待新建线程实例

2-5 线程共用创造进程内资源

2-7 查看线程和‘父’进程的pid

2-8 Thread 实现 “守护线程”

2-8-1 守护线程概念介绍

2-8-2 实现简单 ‘守护线程’

2-9 Thread + Lock 实现线程“互斥锁” 

2-10 Thead + Semaphore 实现 “信号量”

2-11 Thread + Event 实现 “事件”

三、Timer 组件:定时器,n秒后执行操作


一、threading 模块:对线程的处理 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性; 官方链接

二、Thread组件 2-1 开启线程的方式一(函数) from threading import Thread import time def task(name): print('%s is running' % name) time.sleep(2) print('%s is done' % name) if __name__ == '__main__': t = Thread(target=task, args=('线程1',)) t.start() print('main') 2-2 开启线程的方式二 (类) from threading import Thread import time class Mythread(Thread): def run(self): print('%s is running' % self.name) time.sleep(2) print('%s is done' % self.name) if __name__ == '__main__': t = Mythread() t.start() print('main') 2-3 Thread 相关内置子方法 

  • obj.isAlive():返回线程是否为活动状态
  • obj.getName():返回线程名
  • obj.setName():设置线程名
  • threading.currentThread():返回当前的线程变量
  • threading.enumerate():返回一个包含正在运行的线程list,即线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.actibeCount():返回正在运行的线程数量,同 len ( threading.enumerate ( ) )

from threading import Thread import threading from multiprocessing import Process import os def work(): import time time.sleep(3) print(threading.current_thread().getName()) if __name__ == '__main__': #在主进程下开启线程 t=Thread(target=work) t.start() print(threading.current_thread().getName()) print(threading.current_thread()) #主线程 print(threading.enumerate()) #连同主线程在内有两个运行的线程 print(threading.active_count()) print('主线程/主进程') ''' 打印结果: MainThread <_MainThread(MainThread, started 140735268892672)> [<_MainThread(MainThread, started 140735268892672)>, <Thread(Thread-1, started 123145307557888)>] 主线程/主进程 Thread-1 ''' 2-4 主进程等待新建线程实例 from threading import Thread import time def sayhi(name): time.sleep(2) print('%s say hello' %name) if __name__ == '__main__': t=Thread(target=sayhi,args=('egon',)) t.start() t.join() print('主进程') print(t.is_alive()) ''' >>>egon say hello >>>主进程 >>>False ''' 2-5 线程共用创造进程内资源 from threading import Thread n = 100 def task(): global n n = 0 if __name__ == '__main__': t = Thread(target=task) t.start() t.join() print('主', n) ''' >>>主 0 ''' 2-7 查看线程和‘父’进程的pid from threading import Thread import os def task(): print('%s is running' % os.getpid()) if __name__ == '__main__': t = Thread(target=task) t.start() print('主', os.getpid()) ''' >>>14488 is running >>>主 14488 ''' 2-8 Thread 实现 “守护线程” 2-8-1 守护线程概念介绍 守护线程:守护线程会等待主进程内,所有非守护线程,全部运行完毕后,才进行销毁。即,等待进程结束。 2-8-2 实现简单 ‘守护线程’ from threading import Thread import time def foo(): print(123) time.sleep(1) print("end123") def bar(): print(456) time.sleep(3) print("end456") t1 = Thread(target=foo) t2 = Thread(target=bar) t1.daemon = True t1.start() t2.start() print("main-------") ''' >>>123 >>>456 >>>main------- >>>end123 >>>end456 ''' 2-9 Thread + Lock 实现线程“互斥锁”  from threading import Thread, Lock import time mutex = Lock() # 每个线程内创建一把锁 n = 100 def task(): global n # 加锁操作 # mutex.acquire() # temp = n # time.sleep(0.1) # n = temp - 1 # mutex.release() with mutex: temp = n time.sleep(0.1) n = temp - 1 if __name__ == '__main__': t_l = [] for i in range(100): t = Thread(target=task) t_l.append(t) # 添加线程对象 t.start() # 等待每一个线程结束 for t in t_l: t.join() print(n) 2-10 Thead + Semaphore 实现 “信号量”

  • 信号量:保证只有指定数量线程,才能进行连接资源操作。
  • Semaphore:内部管理一个计数器,每次调用acquire()时+1,每次release()时-1.保证了每次连接的指定数量。

from threading import Thread,Semaphore import time,random sm=Semaphore(5) #设置信号量允许连接数 def task(name): sm.acquire() print('%s 正在使用' %name) time.sleep(random.randint(1,3)) sm.release() if __name__ == '__main__': for i in range(20): t=Thread(target=task,args=('路人%s' %i,)) t.start() 2-11 Thread + Event 实现 “事件”

  •  事件:设置面向线程的一个信号标志,控制线程的执行
  • Event对象
    • 包含一个由线程设置的信号标志,允许线程等待事件发生。
    • 在初始状态下,信号标志为False。
    • 如果存在线程等待Event对象,则Event对象的标志为False,线程将被阻塞至对象标志改变为True。
    • 如果一个线程等待一个标志为True的Event对象,那么线程将忽略此事件对象,继续执行。
  • Event对象内部方法
    • event.isSet():返回event的状态
    • event.wait():如果状态值==False,将阻塞线程
    • event.set():如果event的状态值为True,所有阻塞池的线程激活进入就绪状态,等待操作系统调度
    • event.clear():回复envent的状态为False

from threading import Thread,Event import time event=Event() def light(): print('红灯正亮着') time.sleep(3) event.set() #绿灯亮 def car(name): print('车%s正在等绿灯' %name) event.wait() #等灯绿 print('车%s通行' %name) if __name__ == '__main__': # 红绿灯 t1=Thread(target=light) t1.start() # 车 for i in range(10): t=Thread(target=car,args=(i,)) t.start()

三、Timer 组件:定时器,n秒后执行操作 from threading import Timer def hello(): print("hello, world") t = Timer(1, hello) t.start() # after 1 seconds, "hello, world" will be printed

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档