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;
浙公网安备 33010602011771号