Python中尝试多线程编程的一个简明例子
综述 复制代码 代码如下: class Thread( group=None,target=None,name=None,args=(),kwargs={}) 需要关注的参数是target和args. target 是需要子线程运行的目标函数,args是函数的参数,以tuple的形式传递。 以下代码创建一个指向函数worker 的子线程 复制代码 代码如下: def worker(a_tid,a_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个读卡器,每个读卡器收费器每次扣除用户一块钱进入总账中,每读卡器每天一共被刷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 ",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,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) 注意,先不用互斥锁进行临界段访问控制,运行结果如下: 从结果看到,程序确实是多线程运行的。但是由于没有对对象Account进行互斥访问,所以结果是错误的,只有3434612,比原预计少了很多。 打开锁后: 这次可以看到,结果正确了。运行时间比不进行互斥多了很多,不过这也是同步的代价。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |