theading模块的Thread类

属性:

    name   线程名

    ident   线程标识符

    daemon   布尔值,标示是否为守护线程

方法:

  __init__(target=None, name=None, *args=(), **kwargs={})

  start()   开始执行线程

  run()    定义线程功能的方法

  join(timeout=None)  阻塞线程,等待被唤醒,好于忙等待

Thread类的使用主要有三种方法:

1.创建Thread实例,传给其一个参数

2.创建Thread实例,传给其一个可调用的类实例

3.派生Thread子类,创建子类实例

下面介绍这三种用法:

1.创建Thread实例,传给其一个参数

  1. from threading import Thread
  2. from time import ctime, sleep
  3.  
  4. loops = [4, 2]
  5.  
  6. def loop(nloop, nsec):
  7. print('loops ', nloop, 'starting at:', ctime())
  8. sleep(nsec)
  9. print('loop', nloop, 'end at:', ctime())
  10.  
  11. def main():
  12. print('starting at:', ctime())
  13. threads = []
  14.  
  15. for i in range(len(loops)):
  16. t = Thread(target=loop, args=(i,loops[i]))
  17. threads.append(t)        ###保存类实例
  18.  
  19. for i in range(len(loops)):
  20. threads[i].start()        ###同时启动类实例
  21.  
  22. for i in range(len(loops)):
  23. threads[i].join()          ###保持主线程切出
  24.  
  25. print('all done at:', ctime())
  26.  
  27. if __name__ == '__main__':
  28. main()

运行结果:

starting at: Mon Dec 19 23:29:58 2016
loops 0 starting at: Mon Dec 19 23:29:58 2016
loops 1 starting at: Mon Dec 19 23:29:58 2016
loop 1 end at: Mon Dec 19 23:30:00 2016
loop 0 end at: Mon Dec 19 23:30:02 2016
all done at: Mon Dec 19 23:30:02 2016

  方法1,传入函数创建类实例,不用人为设置锁,释放锁

方法二:传入可调用类创建类实例(用法感觉有点像装饰器)

  1. from threading import Thread
  2. from time import ctime, sleep
  3.  
  4. loops = [4, 2]
  5.  
  6. class TFun():
  7. def __init__(self, name, func, args):
  8. self.name = name
  9. self.func = func
  10. self.args = args
  11.  
  12. def __call__(self):
  13. return self.func(*self.args)
  14.  
  15. def loop(nloop, nsec):
  16. print('loop ', nloop, 'at:', ctime())
  17. sleep(nsec)
  18. print('loop ', nloop, 'at:', ctime())
  19.  
  20. def main():
  21. print('starting at:', ctime())
  22. threads = []
  23.  
  24. for i in range(len(loops)):
  25. t = Thread(target=TFun(loop.__name__, loop, (i,loops[i])))
  26. threads.append(t)
  27.  
  28. for i in range(len(loops)):
  29. threads[i].start()
  30.  
  31. for i in range(len(loops)):
  32. threads[i].join()
  33.  
  34. print('all done at:', ctime())
  35.  
  36. if __name__ == '__main__':
  37. main()

运行结果:

starting at: Mon Dec 19 23:46:31 2016
loop 0 at: Mon Dec 19 23:46:31 2016
loop 1 at: Mon Dec 19 23:46:31 2016
loop 1 at: Mon Dec 19 23:46:33 2016
loop 0 at: Mon Dec 19 23:46:35 2016
all done at: Mon Dec 19 23:46:35 2016

方法三:

派生Thread子类,创建子类实例

  1. from threading import Thread
  2. from time import ctime, sleep
  3.  
  4. loops = [4, 2]
  5.  
  6. class mythread(Thread):
  7. def __init__(self, func, args, name=''):
  8. Thread.__init__(self)
  9. self.name = name
  10. self.func = func
  11. self.args = args
  12. self.name = name
  13.  
  14. def run(self): #注意不是__call__(self)
  15. self.func(*self.args)
  16.  
  17. def loop(nloop, nsec):
  18. print('loop', nloop, 'at:', ctime())
  19. sleep(nsec)
  20. print('loop ', nloop, 'end at:', ctime())
  21.  
  22. def main():
  23. print('starting at:', ctime())
  24. threads = []
  25.  
  26. for i in range(len(loops)):
  27. t = mythread(loop,(i,loops[i]))
  28. threads.append(t)
  29.  
  30. for i in range(len(loops)):
  31. threads[i].start()
  32.  
  33. for i in range(len(loops)):
  34. threads[i].join()
  35.  
  36. print('end at:', ctime())
  37.  
  38. if __name__ == '__main__':
  39. main()

运行结果:

starting at: Tue Dec 20 00:06:00 2016
loop 0 at: Tue Dec 20 00:06:00 2016
loop 1 at: Tue Dec 20 00:06:00 2016
loop 1 end at: Tue Dec 20 00:06:02 2016
loop 0 end at: Tue Dec 20 00:06:04 2016
end at: Tue Dec 20 00:06:04 2016

  方法二和方法三可以测试多个函数,其中方法三更加直观。但是方法1更加简单

参考资料:Python核心编程.第四章.Wesley Chun著

【Python@Thread】threading模块的更多相关文章

  1. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  2. Python使用Threading模块创建线程

    使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法: #!/usr/bin/python # -*- coding: UTF-8 ...

  3. 再看python多线程------threading模块

    现在把关于多线程的能想到的需要注意的点记录一下: 关于threading模块: 1.关于 传参问题 如果调用的子线程函数需要传参,要在参数后面加一个“,”否则会抛参数异常的错误. 如下: for i ...

  4. python中threading模块中最重要的Tread类

    Tread是threading模块中的重要类之一,可以使用它来创造线程.其具体使用方法是创建一个threading.Tread对象,在它的初始化函数中将需要调用的对象作为初始化参数传入. 具体代码如下 ...

  5. 学会使用Python的threading模块、掌握并发编程基础

    threading模块 Python中提供了threading模块来实现线程并发编程,官方文档如下: 官方文档 添加子线程 实例化Thread类 使用该方式新增子线程任务是比较常见的,也是推荐使用的. ...

  6. Python之Threading模块

    Thread 先引入一个例子: >>> from threading import Thread,currentThread,activeCount >>> > ...

  7. Python之threading模块的使用

    作用:同一个进程空间并发运行多个操作,专业术语简称为:[多线程] 1.任务函数不带参数多线程 #!/usr/bin/env python # -*- coding: utf-8 -*- import ...

  8. Python(多线程threading模块)

    day27 参考:http://www.cnblogs.com/yuanchenqi/articles/5733873.html CPU像一本书,你不阅读的时候,你室友马上阅读,你准备阅读的时候,你室 ...

  9. python中threading模块中的Join类

    join类是threading中用于堵塞当前主线程的类,其作用是阻止全部的线程继续运行,直到被调用的线程执行完毕或者超时.具体代码如下: import threading,time def doWai ...

  10. Python中threading模块的join函数

    Join的作用是阻塞进程直到线程执行完毕.通用的做法是我们启动一批线程,最后join这些线程结束,例如: for i in range(10): t = ThreadTest(i) thread_ar ...

随机推荐

  1. 距离VR时代的真正到来还有多久?

    2016年被称为是VR元年,各大VR设备商的宣传攻势铺天盖地,众VR产品看的人眼花缭乱.随着平民化进程不断推进以及渗透率的提升,VR成为近两年来最引人关注的焦点,在众多领域的共同作用下,VR时代是否即 ...

  2. 三界商城 ajax调用城市接口,竟然需要登录,调用的接口需要登录,如果不登录 重定向到登录

    现象 商家入驻 填写信息的 ajax请求没有数据 network->name-headers 返回302 发现调用的接口,需要登录,否则重定向登录 //初始化用户信息查询 public func ...

  3. CentOS7 离线安装gcc/pcre-devel/openssl-devel/zlib-devel

    1. 解压CentOS7操作系统安装镜像,进入到CentOS-7.0-1406-x86_64-DVD\Packages目录,这下面存储了很多rpm包. 2. 找到下面列出的rpm包,上传到CentOS ...

  4. C# 动态对象(dynamic)的用法

    说到正确用法,那么首先应该指出一个错误用法: 常有人会拿var这个关键字来和dynamic做比较.实际上,var和dynamic完全是两个概念,根本不应该放在一起做比较.var实际上是编译期抛给我们的 ...

  5. 定位(position)

    position :属性规定元素的定位类型 语法: position : static | absolute | fixed | relative JavaScript语法:object.style. ...

  6. win7安装iis及web配置教程

    下面iis教程只适用win7或win8系统的服务器配置,如果您使用的是xp系统或win2003系统请看:xp或2003安装iis及web配置教程 .注:新手如果嫌iis安装配置麻烦建议下载PageAd ...

  7. Chrome 开发者工具的使用

    Console 那里是可以调节上下文的,不同的文档上下文互相隔离,默认是top,也就是当前打开的页面.这个功能在页面包含 iframe 或者开发插件的时候才用得到. 早期版本的 Resource 已经 ...

  8. Unity发布安卓无法读取StreamingAssets文件下数据库的问题

    在移动端StreamingAssets下的文件是只读的,但大家可能跟我一样遇到了发布安卓以后放在StreamingAssets下的数据库文件一样读取不了, 但其实这个文件夹其实是可以读取到的,所以我们 ...

  9. 链表中LinkList L与LinkList *L 借鉴

    链表中LinkList L与LinkList *L的区别以及(*L).elem,L.elem L->next,(*L)->next的区别typedef struct Node{int el ...

  10. ios开发的系统兼容性问题解决

    对于系统中过时的方法或者是为了向下兼容兼容不同的版本使用最新的方法都要判断当前的系统版本号,在进行方法的调用 1.系统方法过时的注释 ````objc - (void)imagePickerContr ...