Python线程相关

目录

一、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 开启线程的方式一(函数)


 
 
  1. from threading import Thread
  2. import time
  3. def task(name):
  4. print( '%s is running' % name)
  5. time.sleep( 2)
  6. print( '%s is done' % name)
  7. if __name__ == '__main__':
  8. t = Thread(target=task, args=( '线程1',))
  9. t.start()
  10. print( 'main')

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


 
 
  1. from threading import Thread
  2. import time
  3. class Mythread(Thread):
  4. def run(self):
  5. print( '%s is running' % self.name)
  6. time.sleep( 2)
  7. print( '%s is done' % self.name)
  8. if __name__ == '__main__':
  9. t = Mythread()
  10. t.start()
  11. print( 'main')

2-3 Thread 相关内置子方法 

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

 
 
  1. from threading import Thread
  2. import threading
  3. from multiprocessing import Process
  4. import os
  5. def work():
  6. import time
  7. time.sleep( 3)
  8. print(threading.current_thread().getName())
  9. if __name__ == '__main__':
  10. #在主进程下开启线程
  11. t=Thread(target=work)
  12. t.start()
  13. print(threading.current_thread().getName())
  14. print(threading.current_thread()) #主线程
  15. print(threading.enumerate()) #连同主线程在内有两个运行的线程
  16. print(threading.active_count())
  17. print( '主线程/主进程')
  18. '''
  19. 打印结果:
  20. MainThread
  21. <_MainThread(MainThread, started 140735268892672)>
  22. [<_MainThread(MainThread, started 140735268892672)>, <Thread(Thread-1, started 123145307557888)>]
  23. 主线程/主进程
  24. Thread-1
  25. '''

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


 
 
  1. from threading import Thread
  2. import time
  3. def sayhi(name):
  4. time.sleep( 2)
  5. print( '%s say hello' %name)
  6. if __name__ == '__main__':
  7. t=Thread(target=sayhi,args=( 'egon',))
  8. t.start()
  9. t.join()
  10. print( '主进程')
  11. print(t.is_alive())
  12. '''
  13. >>>egon say hello
  14. >>>主进程
  15. >>>False
  16. '''

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


 
 
  1. from threading import Thread
  2. n = 100
  3. def task():
  4. global n
  5. n = 0
  6. if __name__ == '__main__':
  7. t = Thread(target=task)
  8. t.start()
  9. t.join()
  10. print( '主', n)
  11. '''
  12. >>>主 0
  13. '''

 

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


 
 
  1. from threading import Thread
  2. import os
  3. def task():
  4. print( '%s is running' % os.getpid())
  5. if __name__ == '__main__':
  6. t = Thread(target=task)
  7. t.start()
  8. print( '主', os.getpid())
  9. '''
  10. >>>14488 is running
  11. >>>主 14488
  12. '''

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

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

守护线程:守护线程会等待主进程内,所有非守护线程,全部运行完毕后,才进行销毁。即,等待进程结束。

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


 
 
  1. from threading import Thread
  2. import time
  3. def foo():
  4. print( 123)
  5. time.sleep( 1)
  6. print( "end123")
  7. def bar():
  8. print( 456)
  9. time.sleep( 3)
  10. print( "end456")
  11. t1 = Thread(target=foo)
  12. t2 = Thread(target=bar)
  13. t1.daemon = True
  14. t1.start()
  15. t2.start()
  16. print( "main-------")
  17. '''
  18. >>>123
  19. >>>456
  20. >>>main-------
  21. >>>end123
  22. >>>end456
  23. '''

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


 
 
  1. from threading import Thread, Lock
  2. import time
  3. mutex = Lock() # 每个线程内创建一把锁
  4. n = 100
  5. def task():
  6. global n
  7. # 加锁操作
  8. # mutex.acquire()
  9. # temp = n
  10. # time.sleep(0.1)
  11. # n = temp - 1
  12. # mutex.release()
  13. with mutex:
  14. temp = n
  15. time.sleep( 0.1)
  16. n = temp - 1
  17. if __name__ == '__main__':
  18. t_l = []
  19. for i in range( 100):
  20. t = Thread(target=task)
  21. t_l.append(t) # 添加线程对象
  22. t.start()
  23. # 等待每一个线程结束
  24. for t in t_l:
  25. t.join()
  26. print(n)

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

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

 
 
  1. from threading import Thread,Semaphore
  2. import time,random
  3. sm=Semaphore( 5)
  4. #设置信号量允许连接数
  5. def task(name):
  6. sm.acquire()
  7. print( '%s 正在使用' %name)
  8. time.sleep(random.randint( 1, 3))
  9. sm.release()
  10. if __name__ == '__main__':
  11. for i in range( 20):
  12. t=Thread(target=task,args=( '路人%s' %i,))
  13. 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

 
 
  1. from threading import Thread,Event
  2. import time
  3. event=Event()
  4. def light():
  5. print( '红灯正亮着')
  6. time.sleep( 3)
  7. event.set() #绿灯亮
  8. def car(name):
  9. print( '车%s正在等绿灯' %name)
  10. event.wait() #等灯绿
  11. print( '车%s通行' %name)
  12. if __name__ == '__main__':
  13. # 红绿灯
  14. t1=Thread(target=light)
  15. t1.start()
  16. # 车
  17. for i in range( 10):
  18. t=Thread(target=car,args=(i,))
  19. t.start()

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


 
 
  1. from threading import Timer
  2. def hello():
  3. print( "hello, world")
  4. t = Timer( 1, hello)
  5. t.start() # after 1 seconds, "hello, world" will be printed

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值