当前位置:   article > 正文

Python3——多线程之threading模块_python3.11 threading

python3.11 threading

                         Python3——多线程之threading模块

目录

Python3——多线程之threading模块

Threading模块的对象

Threading模块的Thread类

queue模块(线程间通信)


Python 提供了多个模块来支持多线程编程,包括 thread、 threading 和 Queue 模块等。程序是可以使用 thread 和 threading 模块来创建与管理线程。 thread 模块提供了基本的线程和锁定支持;而 threading 模块提供了更高级别、功能更全面的线程管理。使用 Queue 模块,用户可以创建一个队列数据结构,用于在多线程之间进行共享。(推荐使用threading模块比thread模块更高级)

 

  • Threading模块的对象

对象

描述

Thread

线程对象

Lock

互斥锁

Condition

条件变量

Event

事件,该事件发生后所有等待该事件的线程将激活

Semaphore

信号量(计数器)

Timer

定时器,运行前会等待一段时间

Barrier

创建一个障碍,必须达到指定数量线程才开始运行

 

对象

描述

name

线程名(属性)

ident

线程标识符(属性)

daemon

线程是否是守护线程(属性)

_init_(group=None, tatget=None, name=None, args=(),kwargs ={}, verbose=None, daemon=None)

实例化一个线程对象,需要有一个可调用的 target,以及其参数 args或 kwargs。还可以传递 name 或 group 参数,不过后者还未实现。此外, verbose 标 志 也 是 可 接 受 的。 而 daemon 的 值 将 会 设定thread.daemon 属性/标志

start()

开启线程

run()

定义线程功能的方法(通常在子类中被应用开发者重写)

Barrier

创建一个障碍,必须达到指定数量线程才开始运行

  1. import threading
  2. from time import ctime, sleep
  3. loops = (3, 2)
  4. class Mythread(threading.Thread):
  5. def __init__(self, func, args, name=''):
  6. threading.Thread.__init__(self)
  7. self.name = name
  8. self.func = func
  9. self.args = args
  10. ''' rewrite run() '''
  11. def run(self):
  12. self.func(*self.args)
  13. ''' thread handle func --- while(1) '''
  14. def loop(nloop, nsec):
  15. while True:
  16. print('start loop ' + str(nloop), 'at: ' + str(ctime()))
  17. sleep(nsec)
  18. def main():
  19. threads = []
  20. nloops = range(len(loops))
  21. for i in nloops:
  22. t = Mythread(loop, (i + 1, loops[i]), loop.__name__)
  23. threads.append(t)
  24. for i in nloops:
  25. threads[i].start()
  26. if __name__ == '__main__':
  27. main()

  • queue模块(线程间通信)

Queue(maxsize = 0)

创建一个先入先出队列。如果给定最大值,则在队列没有空间时阻塞;否则(没有指定最大值),为无限队列

LifoQueue(maxsize=0)

创建一个后入先出队列。如果给定最大值,则在队列没有空间时阻塞;否则(没有指定最大值),为无限队列

PriorityQueue(maxsize=0)

创建一个优先级队列。如果给定最大值,则在队列没有空间时阻塞,否则(没有指定最大值),为无限队列

Empty

当对空队列调用 get*()方法时抛出异常

Full

当对已满的队列调用 put*()方法时抛出异常

qsize ()

返回队列大小

empty()

如果队列为空,则返回 True;否则,返回 False

full()

如果队列已满,则返回 True;否则,返回 False

put (item, block=Ture, timeout=None)

将 item 放入队列。如果 block 为 True(默认)且 timeout 为 None,则在有可用空间之前阻塞;如果 timeout 为正值,则最多阻塞 timeout 秒;如果 block 为 False,则抛出 Empty 异常

get (block=True, timeout=None)

从队列中取得元素。如果给定了 block(非 0),则一直阻塞到有可用的元素为止

join()

在队列中所有元素执行完毕并调用上面的 task_done()信号之前,保持阻塞

  1. import threading
  2. from random import randint
  3. from queue import *
  4. from time import ctime, sleep
  5. class Mythread(threading.Thread):
  6. def __init__(self, func, name=''):
  7. threading.Thread.__init__(self)
  8. self.name = name
  9. self.func = func
  10. ''' rewrite run() '''
  11. def run(self):
  12. self.func()
  13. class MyQueue():
  14. def __init__(self, q, loops):
  15. self.q = q
  16. self.loops = loops
  17. def WriteQueue(self):
  18. self.q.put('xxx', 1)
  19. def ReadQueue(self):
  20. value = self.q.get(1)
  21. print('value: ' + str(value))
  22. return value
  23. def Writer(self):
  24. while 1:
  25. for i in range(self.loops):
  26. self.WriteQueue()
  27. def Reader(self):
  28. while 1:
  29. for i in range(self.loops):
  30. aaa = self.ReadQueue()
  31. print("aaa = " + str(aaa))
  32. def main():
  33. que = Queue(32)
  34. nloops = randint(2, 5)
  35. q = MyQueue(que, nloops)
  36. t1 = Mythread(q.Writer, q.Writer.__name__)
  37. t2 = Mythread(q.Reader, q.Reader.__name__)
  38. t1.start()
  39. t2.start()
  40. if __name__ == '__main__':
  41. main()

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/143423
推荐阅读
相关标签
  

闽ICP备14008679号