- 論壇徽章:
- 0
|
問題:
程序有時(shí)候運(yùn)行到一半就掛在那兒了,有時(shí)候又運(yùn)行的沒問題。
希望知道線程同步的高手幫幫忙,看看問題在哪兒。
代碼如下:
import threading
import random
import time, sys
class UThread(threading.Thread): ##運(yùn)行任務(wù)函數(shù)的線程類
def __init__(self, event):
threading.Thread.__init__(self)
self.event = event
self.fun = None
self.isbusy = False
self.setDaemon(1)
def isBusy(self):
return self.isbusy
def setFun(self, fun,*args, **kargs): ## 設(shè)定任務(wù)函數(shù)和參數(shù)
self.isbusy = True
self.fun = fun
self.args= args
self.kargs = kargs
def run(self):
while True:
self.event.wait() ##等待run的信號(hào)
self.event.clear()
if self.fun:
self.fun(*self.args, **self.kargs) ##運(yùn)行任務(wù)函數(shù)
self.fun = None ##運(yùn)行完后的清理
self.isbusy = False ##可以分配新的任務(wù)了
class ThreadPool(threading.Thread):
def __init__(self, nThread):
threading.Thread.__init__(self)
self.nThread = nThread ##創(chuàng)建nThread個(gè)線程
self.eventList = [] ##每個(gè)線程都有一個(gè)相應(yīng)的事件來控制它run和wait
self.threadList = [] ##線程列表
self.taskList = [] ##任務(wù)列表
def addTask(self, fun, *args, **kargs):
L = [fun, args, kargs] ##任務(wù)格式:[函數(shù),列表參數(shù), 字典參數(shù)]
self.taskList.append(L)
def taskScheduler(self): ##任務(wù)調(diào)度, 如果任務(wù)列表中還有任務(wù),就在線程列表中找不忙的線程
if len(self.taskList): ##分配給它函數(shù)及參數(shù),在調(diào)用Event的set方法.此時(shí)線程中的run函數(shù)
for i in range(self.nThread): ##停在wait()方法處,接到set信號(hào)后就可以繼續(xù)運(yùn)行
if self.threadList[i].isBusy() == False:
try:
L = self.taskList.pop(0)
except IndexError:
break
self.threadList[i].setFun(L[0], *L[1], **L[2])
self.eventList[i].set()
else:
for i in range(self.nThread):
if self.threadList[i].isBusy():
return ##所有任務(wù)完成了,線程都不是busy的,就結(jié)束程序
sys.exit(0)
def createThread(self): ##創(chuàng)建nThread個(gè)線程,并為每個(gè)線程建一個(gè)Event
for i in range(self.nThread):
event = threading.Event()
self.eventList.append(event)
self.threadList.append(UThread(event))
for i in range(self.nThread):
self.threadList[i].start()
def run(self):
self.createThread()
while True:
self.taskScheduler() ##每隔1秒種調(diào)用一次任務(wù)調(diào)度函數(shù)
time.sleep(1)
def test():
def fun(t, msg):
time.sleep(t)
print msg
pool = ThreadPool(7)
pool.start()
for i in range(50): ##50個(gè)任務(wù),7個(gè)線程
pool.addTask(fun, random.randint(1, 20), '%d msg'%i)
if __name__ == "__main__":
test() |
|