python:キューの深さに基づく自己管理型スレッド化クラス

以下のコードサンプルを検討してください:

class DbWorker(Thread):
    def __init__(self, dbws, dbwa, dbwm, dbq, dbqx, logr):
        self.__dbws = dbws      # db worker semaphore 
        self.__dbwa = dbwa      # db workers active counter
        self.__dbwm = dbwm      # db workers max active 
        self.__dbQ  = dbq       # db queue 
        self.__dbqx = dbqx      # db query execution counter
        #self.__rq  = rq        # response queue 
        self.__logr = logr      # logger

        self.__lock = threading.Lock()
        self.__id   = "DB_"+str(time.time())

        try: 
            self.__dbConn = mysql.MySQL(DBHOST, DBUSER, DBPASS, DBNAME, self.__id)

        except MySQLdb, e: 
            self.__msg = 'EXCEPTION: %s - %d: %s' % (str(time.ctime()), e.args[0], e.args[1])
            self.__lorg.write ("DEBUG", "mysql", self.__msg)

        """ Acquire semaphore """
        self.__dbws.acquire()

            """ Acquire semaphore """
        self.__lock.acquire()
        Thread.__init__(self, name = self.__id)


    def run(self):
        while 1:

            self.__qi = self.__dbQ.get()
            #print "ITEM: " + str(self.__qi)
            # start up new thread if q not empty and active workers limit not reached  

            if (self.__dbwa.status() < self.__dbwm ) and (self.__dbQ.qsize() > self.__dbwa.status() - 1):
                DbWorker(self.__dbws, self.__dbwa, self.__dbwm, self.__dbQ, self.__dbqx, self.__logr).start() 
                self.__dbwa.increase()


            if self.__qi == None:

                #self._dbwa = global DBWactive
                if self.__dbwa.status() > 1:
                    self.__dbwa.decrease()
                    self.__dbConn.closeConn()
                    self.__dbws.release()
                    self.__lock.release()
                    self.__dbQ.task_done()
                    break

                else:
                    self.__dbQ.task_done()
                    time.sleep(1/2)

            # just execute query
            elif self.__qi[0] == "exec":
                self.__logr.write("DEBUG", "SQLQR", self.__qi[1])
                self.__qry = self.__qi[1]

                try:
                    self.__result = self.__dbConn.insert(self.__qry)

                except MySQLdb, e:
                    self.__msg = 'ERROR: %s %s \n %d: %s' % (str(self.__id), str(self.__qry), e.args[0], eargs[1])
                    self.__logr.write("DEBUG", "dbworker", self.__msg)

                self.__dbQ.task_done()
                self.__dbqx.increase()


            if (self.__dbQ.qsize() + 1) < self.__dbwa.status():
                    while self.__dbwa.status() > self.__dbQ.qsize()+1:
                        self.__dbQ.put(None)

私はあなたの意見を次のようにしたいと思います:

これはスレッド管理の良いアプローチですか?メインプロセスが時折ハングしているのを見て、それを再起動する必要があります。

あるスレッドをアクティブにしてキューを管理し、必要に応じてさらに多くのスレッドを起動するときに問題が発生することはありますか?

メインプロセスが停止しているのはなぜですか?実行中のスレッドまたはメインプロセスからの例外はありません。

2

答えはありません

0