首页 > python threading模块多线程源码示例(二)

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

更多相关:

  • 多线程有什么好处?提高CPU的利用率,更好地利用系统资源,使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段,使用不同的同步类创建自己的同步机制。多线程指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程提升整体处理性能。多线程是指程序中包含多个执行流,即...

  • Step1:在界面主函数的构造函数中初始化多线程 auto mythread = new QThread(); //新建connect(mythread , &QThread::finished, mythread, &QObject::deleteLater);//线程运行结束后释放内存object1->moveToThread...

  • 一、thread的基本用法 参见C++使用thread类多线程编程 。 二、类外使用多线程,访问类的成员 这几种方式,新建线程都是在类外,然后通过把友元函数或者成员函数作为thread参数。 #include #include #include using namesp...

  • 本博文是根据中科大信息学院谭立湘老师的课件加上自己的理解整理出来的 ************************************************************************************ NVIDIA在2007年推出CUDA这个统一计算架构 CUDA的基本思想是支持大量的线程级并...

  • 一、parallel communication patterns   并行通信模式 Map:映射,在特定的位置读取和写入。 Gather:收集,从多个不同的位置读入,写入一个位置。 Scatter:分发,写入多个位置。 Transpose转置 结构数组缩写为AOS,数组结构缩写为SOA 转置运算是指任务重新排序内存中的数...

  • 最近从 kvell 这篇论文中看到一些单机存储引擎的优秀设计,底层存储硬件性能在不远的未来可能不再是主要的性能瓶颈,反而高并发下的CPU可能是软件性能的主要限制。像BPS/AEP/Optane-SSD 等Intel 推出的硬件存储栈已经能够在延时上接近DRAM的量级,吞吐在较低的队列深度下更是能够超越当前主流NVMe-ssd 数倍甚至...