一.思路概述

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模块多线程源码示例(二)相关推荐

  1. python threading模块多线程源码示例(一)

    使用python模块threading来编写多线程程序的基本思想就是, 在threading.Thread类的基础上派生出一个子类,  将业务逻辑在该子类的run函数中实现, 创建该子类对象的线程池, ...

  2. 京东广告典型源码示例二

    广告资源链接 http://x.jd.com/exsites?spread_type=2&ad_ids=208:5&location_info=0&callback=getjj ...

  3. 简单的java多线程源码分享(二)

    2019独角兽企业重金招聘Python工程师标准>>> /** * 军队线程 * 模拟作战双方的行为 * @author gent * */ public class ArmyRun ...

  4. Python中如何查看模块的源码内容

    ubuntu中查看python模块的源码 1. 打开ipython3,进入交互式解释器 2. 导入模块,以io模块为例,查看io.__file__属性,找到源码文件的路径 3. 使用cat命令查看源码 ...

  5. set在python中的用法_python中set的用法:详细源码示例

    这篇文章主要为大家详细介绍了python中set的用法:详细源码示例,具有一定的参考价值,可以用来参考一下. set函数基本用法感兴趣的小伙伴,下面一起跟随512笔记的小编罗X来看看吧. python ...

  6. python求素数积_用Python求素数的快速算法源码示例

    本篇文章为Python算法相关,用Python求素数的快速算法源码示例.算法在Python的学习中算是一个要点,能研究明白算法的同学都可以算的上是Python的大牛了. 首先简单的来说下什么是素数:质 ...

  7. Python threading Thread多线程的使用方法

    Python threading Thread多线程的使用方法 参考资料:<Python 多线程>http://www.runoob.com/python/python-multithre ...

  8. 小白学习pytorch源码(二):setup.py最详细解读

    小白学习pytorch源码(二) pytorch setup.py最全解析 setup.py与setuptools setup.py最详细解读 setup.py 环境检查 setup.py setup ...

  9. 呼吸灯代码linux,ESP32 开发笔记(三)源码示例 3_LEDC_PWM 使用LEDC实现LED呼吸灯

    开发板购买链接 开发板简介 开发环境搭建 windows 源码示例: 0_Hello Bug (ESP_LOGX与printf)    工程模板/打印调试输出 1_LED                ...

最新文章

  1. 西部数码买哪处线路的云服务器,云服务器买哪个区合适
  2. 炫酷大屏demo_可视化大屏动态效果
  3. 服务器跑python程序_远程编写+调试服务器上的Python程序
  4. Python基本类型-列表
  5. Py之Xlrd:Xlrd简介、安装、使用方法(读取xlsx文件的shee表头名/总行数/总列数、每一行的内容、指定列的内容)之详细攻略
  6. Java引用类型与常量
  7. Apache Spark概述
  8. Spring Boot☞HelloWorld开篇
  9. web安全学习-验证机制存在的问题
  10. 2017西安交大ACM小学期数据结构 [树状数组,极大值]
  11. fetch 不是xhr_春招|前端2019应届春招:不是被大厂选,而是选大厂(字节跳动,美团,网易)...
  12. Teams 的逻辑架构与语音解决方案 - Official Posters Download
  13. xor在PHP是什么意思,?=‘在PHP中是什么意思?
  14. colab显示没有gpu的解决方法
  15. Mind_Manager_2
  16. 乐视赚钱的时候,贾跃亭特别喜欢找明星入股
  17. python进阶06并发之二技术点关键词
  18. 30岁菜鸟涛学习VB.net 第十三天
  19. springMVC 理解大综合
  20. winhex的内存搜索法

热门文章

  1. 改变mac中launchpad图标大小
  2. 更换AppleWWDRCA.cer证书
  3. 需要反射时使用dynamic
  4. 《OpenCV3编程入门》学习笔记9 直方图与匹配(三)直方图对比
  5. usaco Raucous Rockers(dp)
  6. linux 股票指南针,linux 基础命令 1
  7. python添加行索引_python-熊猫在特定级别向多索引添加行
  8. 网页如何与mysql服务器建立连接不上,html与mysql建立连接数据库
  9. python如何创建一个类_python (知识点:类)简单的创建一个类
  10. 计算机组成原理2套题,计算机组成原理试卷及答案2套.doc