Python 之 threading
创建多线程常用的三种方法:
- 创建Thread的实例,传给它一个函数
- 创建Thread的实例,传给它一个可调用的类实例(不推荐)
- 派生Thread的子类,并创建子类的实例(推荐)
创建Thread的实例,传给它一个函数
#!/usr/bin/env python
# coding:utf-8 import threading
from time import ctime, sleep loops = [4, 2] def loop(n, sec):
print 'start loop', n, ' at: ', ctime()
sleep(sec)
print 'loop', n, ' done at: ', ctime() def main():
print 'starting at: ', ctime()
threads = []
nloops = range(len(loops)) for i in nloops:
t = threading.Thread(target=loop, args=(i, loops[i]))
threads.append(t) for i in nloops: # start threads
threads[i].start() for i in nloops: # wait for all threads to finish
threads[i].join() print 'all DONE at: ', ctime() if __name__ == '__main__':
main()
执行结果:
liuqian@ubuntu:~$ python test_threading1.py
starting at: Wed Jul 20 13:20:06 2016
start loop 0 at: Wed Jul 20 13:20:06 2016
start loop 1 at: Wed Jul 20 13:20:06 2016
loop 1 done at: Wed Jul 20 13:20:08 2016
loop 0 done at: Wed Jul 20 13:20:10 2016
all DONE at: Wed Jul 20 13:20:10 2016
【说明】
join([timeout])方法将等待线程结束,或者在提供了超时时间的情况下达到超时时间。对于join()方法而言,其实它根本不需要调用。一旦线程启动,它就会一直执行,直到给定的函数完成后退出。如果主线程还有其他事情要去做,而不是等待这些线程完成(例如其他处理或者等待新的客户端请求),就可以不调用join()。join()只在你需要等待线程完成的时候才是有用的。
创建Thread的实例,传给它一个可调用的类实例
#!/usr/bin/env python
# coding:utf-8 import threading
from time import ctime, sleep loops = [4,2] class ThreadFunc(object): def __init__(self, func, args, name=''):
self.name = name
self.func = func
self.args = args def __call__(self):
self.func(*self.args) def loop(n, sec):
print 'start loop', n, ' at: ', ctime()
sleep(sec)
print 'loop', n, ' done at: ', ctime() def main():
print 'starting at: ', ctime()
threads = []
nloops = range(len(loops)) for i in nloops:
t = threading.Thread(target=ThreadFunc(loop, (i, loops[i]), loop.__name__))
threads.append(t) for i in nloops: # start threads
threads[i].start() for i in nloops: # wait for all threads to finish
threads[i].join() print 'all DONE at: ', ctime() if __name__ == '__main__':
main()
输出与第一个案例一样。
【说明】当创建新线程时,Thread类的代码将调用ThreadFunc对象,此时会调用__cal__()这个特殊方法。
派生Thread的子类,并创建子类的实例(推荐)
#!/usr/bin/env python
# coding:utf-8 import threading
from time import ctime, sleep loops = [4,2] class MyThread(threading.Thread): def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args def run(self): # 必须要写
self.func(*self.args) def loop(n, sec):
print 'start loop', n, ' at: ', ctime()
sleep(sec)
print 'loop', n, ' done at: ', ctime() def main():
print 'starting at: ', ctime()
threads = []
nloops = range(len(loops)) for i in nloops:
t = MyThread(loop, (i, loops[i]), loop.__name__)
threads.append(t) for i in nloops: # start threads
threads[i].start() for i in nloops: # wait for all threads to finish
threads[i].join() print 'all DONE at: ', ctime() if __name__ == '__main__':
main()
Python 之 threading的更多相关文章
- python中threading的用法
摘自:http://blog.chinaunix.net/uid-27571599-id-3484048.html 以及:http://blog.chinaunix.net/uid-11131943- ...
- python中threading模块详解(一)
python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- Python 线程(threading) 进程(multiprocessing)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Python 线程(threading)
Python 的thread模块是比较底层的模块,Python的threading模块是对thread做了一些包装,可以更加方便的 被使用; 1. 使用threading 模块 # 示例一: 单线程执 ...
- Python之threading多线程,多进程
1.threading模块是Python里面常用的线程模块,多线程处理任务对于提升效率非常重要,先说一下线程和进程的各种区别,如图 概括起来就是 IO密集型(不用CPU) 多线程计算密集型(用CPU) ...
- Python的threading和multiprocessing
Python的threading 基础用法, 通过 threading.Thread() 创建线程, 然后 start() 和 join() import time import threading ...
- python使用threading获取线程函数返回值的实现方法
python使用threading获取线程函数返回值的实现方法 这篇文章主要介绍了python使用threading获取线程函数返回值的实现方法,需要的朋友可以参考下 threading用于提供线程相 ...
- python:threading多线程模块-创建线程
创建线程的两种方法: 1,直接调用threading.Thread来构造thread对象,Thread的参数如下: class threading.Thread(group=None, target= ...
随机推荐
- linux下MySQL安装及设置
转自:http://www.entage.net/1/viewspace-25420 1. 关于本文 本文将以MySQL 5.0.51为例,以CentOS 5为平台,讲述MySQL数据库的安装和 ...
- 全新的跨平台app软件开发工具——Lae软件开发平台
Lae是一款运行于windows的界面开发工具,具有所见即所得.开发跨平台.UI布局自由.机制简单.维护容易等诸多优点,可以开发同时运行在windows.Linux.MacOX.iOS.Android ...
- node.js Websocket实现扫码二维码登录---GoEasy
最近在做一个扫码登录功能,为此我还在网上搜了一下关于微信的扫描登录的实现方式.当这个功能完成了后,我决定将整个实现思路整理出来,方便自己以后查看也方便其他有类似需求的程序猿些. 要实现扫码登录我们需要 ...
- ipython安装
sudo pip install jupyter 然后用jupyter notebook来运行
- php session的理解与使用
session学习参考链接:1.http://www.w3cschool.cn/php_sessions.html:2.http://php.net/manual/zh/book.session.ph ...
- 关于a和b不用第三变量交换值的问题
今天在如鹏网(不是发广告)上看到一道题,题目很难就不说了,但是老师给的提示的题目却让我感兴趣,就是标题的内容. 题目是把a与b做异或比较从而实现不通过第三变量来交换a和b的数值答案是这样的: a=a^ ...
- 跟我学Windows Azure 五 使用Cloub Service连接Blob Service完成图片的上传
首先,我们创建一个云服务项目,用来演示我们的blob存储 下来我们修改我们我们云服务的名字 我们需要添加一个空的WebForm的项目 点击完成,我们可以看到我们的解决方案已经添加完成 下来我们需要添加 ...
- subprocess模块
subprocess的目的就是启动一个新的进程并且与之通信. subprocess模块中只定义了一个类: Popen.可以使用Popen来创建进程,并与进程进行复杂的交互.它的构造函数如下: subp ...
- PostgreSQL的权限查询
查看哪些用户对表sns_log_member_b_aciton有哪些权限: sns_log=> \z sns_log_member_b_aciton Access privileges Sche ...
- edgesForExtendedLayout,automaticallyAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars的影响
在IOS7以后 ViewController 开始使用全屏布局的,而且是默认的行为通常涉及到布局 就离不开这个属性 edgesForExtendedLayout,它是一个类型为UIExtendedEd ...