对python:threading.Thread类的使用方法详解

作者:DrStream 时间:2022-01-24 04:19:28 

Python Thread类表示在单独的控制线程中运行的活动。有两种方法可以指定这种活动:

1、给构造函数传递回调对象


mthread=threading.Thread(target=xxxx,args=(xxxx))
mthread.start()

2、在子类中重写run() 方法

这里举个小例子:


import threading, time
class MyThread(threading.Thread):
 def __init__(self):
   threading.Thread.__init__(self)
 def run(self):
   global n, lock
   time.sleep(1)
   if lock.acquire():
     print n , self.name
     n += 1
     lock.release()
if "__main__" == __name__:
 n = 1
 ThreadList = []
 lock = threading.Lock()
 for i in range(1, 200):
   t = MyThread()
   ThreadList.append(t)
 for t in ThreadList:
   t.start()
 for t in ThreadList:
   t.join()

派生类中重写了父类threading.Thread的run()方法,其他方法(除了构造函数)都不应在子类中被重写,换句话说,在子类中只有_init_()和run()方法被重写。使用线程的时候先生成一个子线程类的对象,然后对象调用start()方法就可以运行线程啦(start调用run)

下面我们进入本文的正题threading.Thread类的常用函数与方法:

1、一旦线程对象被创建,它的活动需要通过调用线程的start()方法来启动。这方法再调用控制线程中的run方法。

2、一旦线程被激活,则这线程被认为是'alive'(活动)。当它的run()方法终止时-正常退出或抛出未处理的异常,则活动状态停止。isAlive()方法测试线程是否是活动的。大致上,线程从 start()调用开始那点至它的run()方法中止返回时,都被认为是活动的。模块函数enumerate()返回活动线程的列表。

3、一个线程能调用别的线程的join()方法。这将阻塞调用线程,直到拥有join()方法的线程的调用终止。

4、线程有名字,默认的是Thread-No形式的,名字能传给构造函数,通过setName()方法设置,用getName()方法获取。

5、线程能被标识为'daemon thread'(守护线程).这标志的特点是当剩下的全是守护线程时,则Python程序退出。它的初始值继承于创建线程。标志用setDaemon()方法设置,用isDaemon()获取。

6、存在'main thread'(主线程),它对应于Python程序的初始控制线程。它不是后台线程。

7、


class Thread(group=None, target=None, name=None, args=(), kwargs={})

构造函数能带有关键字参数被调用。

这些参数是:

group 应当为 None,为将来实现Python Thread类的扩展而保留。

target 是被 run()方法调用的回调对象. 默认应为None, 意味着没有对象被调用。

name 为线程名字。默认形式为'Thread-N'的唯一的名字被创建,其中N 是比较小的十进制数。

args是目标调用参数的tuple,默认为空元组()。

kwargs是目标调用的参数的关键字dictionary,默认为{}。

8、如果子线程重写了构造函数,它应保证调用基类的构造函数(Thread._init_()),在线程中进行其他工作之前。(也就是派生类刚开始就要调用基类的构造函数)

9、start()

启动线程活动。在每个线程对象中最多被调用一次。它安排对象的run() 被调用在一单独的控制线程中。

10、run()

用以表示线程活动的方法。你可能在Python Thread类的子类重写这方法。标准的 run()方法调用作为target传递给对象构造函数的回调对象。

11、join([timeout])

等待至线程中止。阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。

timeout参数不是None,它应当是浮点数指明以秒计的操作超时值。因为join()总是返回None,你必须调用isAlive()来判别超时是否发生。

当timeout 参数没有被指定或者是None时,操作将被阻塞直至线程中止。

线程能被join()许多次。

线程不能调用自身的join(),因为这将会引起死锁。

在线程启动之前尝试调用join()会发生错误。

12、

getName()

返回线程名。

setName(name)

设置线程名。

这名字是只用来进行标识目的的字符串。它没有其他作用。多个线程可以取同一名字。最初的名字通过构造函数设置。

isAlive()

返回线程是否活动的。

isDaemon()

返回线程的守护线程标志。

setDaemon(daemonic)

设置守护线程标志为布尔值daemonic。它必须在start()调用之前被调用。

当没有活动的非守护线程时,整个Python程序退出。

来源:https://blog.csdn.net/drdairen/article/details/60962439

标签:python,threading,Thread
0
投稿

猜你喜欢

  • python3 googletrans超时报错问题及翻译工具优化方案 附源码

    2022-07-15 12:05:47
  • Go语言Goroutinue和管道效率详解

    2024-02-02 18:19:09
  • C#中通过使用Connection类来实现打开/关闭数据库的代码实例

    2024-01-21 22:36:55
  • 不要使用@import[译]

    2009-05-01 12:01:00
  • Oracle与SQL Server在企业应用的比较

    2024-01-25 07:22:11
  • 解决nohup执行python程序log文件写入不及时的问题

    2021-06-16 14:04:30
  • Python中 join() 函数的使用示例讲解

    2023-03-29 02:32:25
  • 使用php+swoole对client数据实时更新(一)

    2024-05-03 15:13:08
  • opencv读取视频并保存图像的方法

    2023-02-21 17:30:16
  • Python用61行代码实现图片像素化的示例代码

    2021-08-27 13:10:55
  • Golang共享变量如何解决问题

    2024-04-26 17:34:09
  • Flask路由尾部有没有斜杠有什么区别

    2021-03-17 12:00:58
  • 必备 SQL 查询优化技巧提升网站访问速度

    2024-01-18 23:59:37
  • Python创建系统目录的方法

    2023-11-22 11:52:47
  • git恢复删除的分支及内容的方法

    2023-03-09 20:16:27
  • MySql学习笔记之事务隔离级别详解

    2024-01-21 23:54:28
  • Python参数类型以及常见的坑详解

    2023-04-16 13:52:33
  • pycharm工具连接mysql数据库失败问题

    2024-01-22 05:01:27
  • pandas的排序、分组groupby及cumsum累计求和方式

    2023-07-20 07:00:39
  • python opencv 找出图像中的最大轮廓并填充(生成mask)

    2021-01-14 23:42:10
  • asp之家 网络编程 m.aspxhome.com