python threading模块多线程源码示例(二)
一.思路概述
Python线程创建
使用threading模块的Thread类的接口如下
class Thread( group=None, target=None, name=None, args=(), kwargs={})
需要关注的参数是target和args. target 是需要子线程运行的目标函数,args是函数的参数,以tuple的形式传递。
以下代码创建一个指向函数worker的子线程
def worker(tid,account):
...
th = threading.Thread(target=worker,args=(i,acc) ) ;
启动这个线程
th.start()
等待线程返回或者回收线程资源
threading.Thread.join(th)
或者th.join()
如果你可以对要处理的数据进行很好的划分,而且线程之间无须通信,那么你可以使用:创建=》运行=》回收的方式编写你的多线程程序。但是如果线程之间需要访问共同的对象,则需要引入互斥锁或者信号量对资源进行互斥访问。
下面讲讲如何创建互斥锁
创建锁
g_mutex = threading.Lock()
....
使用锁
for ... :
#锁定,从下一句代码到释放前互斥访问
g_mutex.acquire()
a_account.deposite(1)
#释放
g_mutex.release()
二.业务需求
模拟一个公交地铁IC卡缴车费的多线程程序
假设有10个读卡器,每个读卡器收费器每次扣除用户一块钱进入总账中,每个读卡器每天一共被刷1000000次。账户原有100块。所以最后的总账应该为10000100。
三.源码实现
#!/usr/bin/env python
#encoding: utf-8import time, datetime, threading#each worker thread exec 1000000 times
def worker(tid, account):global g_mutexfor i in range(1000000):g_mutex.acquire()if i%500000 == 0:print 'worker thread', tid, 'count', iaccount.deposite(1)g_mutex.release()#account operation class
class Account:def __init__(self, base):self.m_amount = basedef deposite(self, amount):self.m_amount += amount;def withdraw(self, amount):self.m_amount -= amount#main entry point...
if __name__ == '__main__':global g_mutexcount = 0;tm_start = datetime.datetime.now()print 'Main Thread start at:', tm_start#initialize thread poolthread_pool = []#initialize mutexg_mutex = threading.Lock()#init thread itemsacc = Account(100)for i in range(10):t = threading.Thread(target=worker, args=(i, acc));thread_pool.append(t)#start worker threads one by onefor i in range(10):thread_pool[i].start()#reclaim all worker threads resourcefor i in range(10):threading.Thread.join(thread_pool[i])#statisticstm_stop = datetime.datetime.now()print 'count=', acc.m_amountprint 'Main Thread end at:', tm_stopprint 'time consumption ', tm_stop-tm_start
四.运行效果截图
注意在多线程环境下print输出要放到互斥锁下面操作,才不会导致导致各线程的打印信息混乱.
参考文献
[1].http://blog.csdn.net/liangpz521/article/details/8906861
python threading模块多线程源码示例(二)相关推荐
- python threading模块多线程源码示例(一)
使用python模块threading来编写多线程程序的基本思想就是, 在threading.Thread类的基础上派生出一个子类, 将业务逻辑在该子类的run函数中实现, 创建该子类对象的线程池, ...
- 京东广告典型源码示例二
广告资源链接 http://x.jd.com/exsites?spread_type=2&ad_ids=208:5&location_info=0&callback=getjj ...
- 简单的java多线程源码分享(二)
2019独角兽企业重金招聘Python工程师标准>>> /** * 军队线程 * 模拟作战双方的行为 * @author gent * */ public class ArmyRun ...
- Python中如何查看模块的源码内容
ubuntu中查看python模块的源码 1. 打开ipython3,进入交互式解释器 2. 导入模块,以io模块为例,查看io.__file__属性,找到源码文件的路径 3. 使用cat命令查看源码 ...
- set在python中的用法_python中set的用法:详细源码示例
这篇文章主要为大家详细介绍了python中set的用法:详细源码示例,具有一定的参考价值,可以用来参考一下. set函数基本用法感兴趣的小伙伴,下面一起跟随512笔记的小编罗X来看看吧. python ...
- python求素数积_用Python求素数的快速算法源码示例
本篇文章为Python算法相关,用Python求素数的快速算法源码示例.算法在Python的学习中算是一个要点,能研究明白算法的同学都可以算的上是Python的大牛了. 首先简单的来说下什么是素数:质 ...
- Python threading Thread多线程的使用方法
Python threading Thread多线程的使用方法 参考资料:<Python 多线程>http://www.runoob.com/python/python-multithre ...
- 小白学习pytorch源码(二):setup.py最详细解读
小白学习pytorch源码(二) pytorch setup.py最全解析 setup.py与setuptools setup.py最详细解读 setup.py 环境检查 setup.py setup ...
- 呼吸灯代码linux,ESP32 开发笔记(三)源码示例 3_LEDC_PWM 使用LEDC实现LED呼吸灯
开发板购买链接 开发板简介 开发环境搭建 windows 源码示例: 0_Hello Bug (ESP_LOGX与printf) 工程模板/打印调试输出 1_LED ...
最新文章
- 西部数码买哪处线路的云服务器,云服务器买哪个区合适
- 炫酷大屏demo_可视化大屏动态效果
- 服务器跑python程序_远程编写+调试服务器上的Python程序
- Python基本类型-列表
- Py之Xlrd:Xlrd简介、安装、使用方法(读取xlsx文件的shee表头名/总行数/总列数、每一行的内容、指定列的内容)之详细攻略
- Java引用类型与常量
- Apache Spark概述
- Spring Boot☞HelloWorld开篇
- web安全学习-验证机制存在的问题
- 2017西安交大ACM小学期数据结构 [树状数组,极大值]
- fetch 不是xhr_春招|前端2019应届春招:不是被大厂选,而是选大厂(字节跳动,美团,网易)...
- Teams 的逻辑架构与语音解决方案 - Official Posters Download
- xor在PHP是什么意思,?=‘在PHP中是什么意思?
- colab显示没有gpu的解决方法
- Mind_Manager_2
- 乐视赚钱的时候,贾跃亭特别喜欢找明星入股
- python进阶06并发之二技术点关键词
- 30岁菜鸟涛学习VB.net 第十三天
- springMVC 理解大综合
- winhex的内存搜索法
热门文章
- 改变mac中launchpad图标大小
- 更换AppleWWDRCA.cer证书
- 需要反射时使用dynamic
- 《OpenCV3编程入门》学习笔记9 直方图与匹配(三)直方图对比
- usaco Raucous Rockers(dp)
- linux 股票指南针,linux 基础命令 1
- python添加行索引_python-熊猫在特定级别向多索引添加行
- 网页如何与mysql服务器建立连接不上,html与mysql建立连接数据库
- python如何创建一个类_python (知识点:类)简单的创建一个类
- 计算机组成原理2套题,计算机组成原理试卷及答案2套.doc