亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3295 | 回復(fù): 3
打印 上一主題 下一主題

求救:線程池問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-10-09 17:55 |只看該作者 |倒序?yàn)g覽
問題:
程序有時(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()

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2006-10-11 15:20 |只看該作者
我測(cè)了一下:

1484 00093 msg
Traceback (most recent call last):
  File "t.py", line 56, in taskScheduler
    L = self.taskList.pop(0)
IndexError: pop from empty list
None
3908 00087 msg
1484 00099 msg
2156 00097 msg
2892 00088 msg


使用 import traceback; traceback.print_exc();

使用thread.jion() 來等待線程結(jié)束.

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2006-10-11 16:36 |只看該作者
為什么你的結(jié)果是
3908 0087 msg。。。
是改了線程數(shù)和任務(wù)數(shù)量么?100個(gè)線程,4000個(gè)任務(wù)?

子線程中的run()函數(shù)都是while True 的無限循環(huán),因此不能在ThreadPool中用thread.jion方法來等待線程結(jié)束。

那個(gè)pop的異常已經(jīng)被捕獲了,異常發(fā)生說明任務(wù)以經(jīng)全部分配完了,應(yīng)該不會(huì)導(dǎo)致程序掛在那兒沒有響應(yīng)。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2006-10-12 13:06 |只看該作者
不好意思, 我把線程的ID,打出來了.   
print thread.get_ident(), msg


"掛在那兒": 是不是死鎖了, 程序不能結(jié)束了.
我測(cè)了好幾次,都正常結(jié)束了.
用笨辦法, 多寫print 作調(diào)試吧, ^_^.
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP