Python多线程

Python线程创建

1.使用threading模块的Thread类

class Thread( group=None, target=None, name=None, args=(), kwargs={}) 

 

2.创建一个函数

以下代码创建一个指向函数worker 的子线程

def worker(a_tid,a_account):
    ...
th = threading.Thread(target=worker,args=(i,acc)) ;

启动这个线程

th.start()

 

等待线程返回

threading.Thread.join(th)
或者th.join()

 3.创建互斥锁

创建锁
g_mutex = threading.Lock()

....
使用锁

for ... :
  #锁定,从下一句代码到释放前互斥访问
  g_mutex.acquire()
  a_account.deposite(1)
  #释放
  g_mutex.release()

例子:模拟一个公交地铁IC卡缴车费的多线程程序

有10个读卡器,每个读卡器收费器每次扣除用户一块钱进入总账中,每读卡器每天一共被刷10000000次。账户原有100块。所以最后的总账应该为10000100。先不使用互斥锁来进行锁定(注释掉了锁定代码),看看后果如何。

import time,datetime
import threading

def worker(a_tid,a_account):
    global g_mutex
    print "Str " , a_tid, datetime.datetime.now()
    for i in range(1000000):
        #g_mutex.acquire()
        a_account.deposite(1)
        #g_mutex.release()
    print "End " , a_tid , datetime.datetime.now()
   
class Account:
    def __init__ (self, a_base ):
        self.m_amount=a_base
    def deposite(self,a_amount):
        self.m_amount+=a_amount
    def withdraw(self,a_amount):
        self.m_amount-=a_amount   
       
if __name__ == "__main__":
    global g_mutex
    count = 0
    dstart = datetime.datetime.now()
    print "Main Thread Start At: " , dstart

    #init thread_pool
    thread_pool = []
    #init mutex
    g_mutex = threading.Lock()
    # init thread items
    acc = Account(100)
    for i in range(10):
        th = threading.Thread(target=worker,args=(i,acc) ) ;
        thread_pool.append(th)
       
    # start threads one by one       
    for i in range(10):
        thread_pool[i].start()
   
    #collect all threads
    for i in range(10):
        threading.Thread.join(thread_pool[i])
    dend = datetime.datetime.now()
    print "count=",acc.m_amount
    print "Main Thread End at: " ,dend , " time span " , dend-dstart;

你可能感兴趣的:(python)