日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python 插件架構(gòu) 多線程多任務(wù)

系統(tǒng) 1775 0

目的:很多時(shí)候,我們需要多個(gè)不同策略去完成一個(gè)任務(wù),那個(gè)插件架構(gòu)是很好一個(gè)選擇。而每一個(gè)策略,不希望一個(gè)個(gè)去執(zhí)行,還能實(shí)時(shí)上報(bào)數(shù)據(jù),所以每一個(gè)插件都是異步執(zhí)行,把每一個(gè)插件結(jié)果回調(diào)方法實(shí)時(shí)上報(bào),然后寫入數(shù)據(jù)。

?

python 插件架構(gòu) 多線程多任務(wù)_第1張圖片

線程工具類

#app/MyThread.py

            
              import threading
class MyThread(threading.Thread):
    def __init__(self, func, **kwargs):
        threading.Thread.__init__(self)
        self.func = func
        self.kwargs = kwargs
        self.thread_stop = False

    def run(self):
        self.func(self, self.kwargs)

    def stop(self):
        self.thread_stop = True
            
          

插件管理中心

#app/platform.py

            
              #coding=utf-8
from .MyThread import MyThread
# 注冊(cè)加載插件
# 多線程運(yùn)行插件
# 回調(diào)返回?cái)?shù)據(jù),放入寫入隊(duì)列
class DataManagerProcessor(object):
    PLUGINS = {}

    def run_plugin(self,parent,args):
        self.PLUGINS[args["plugin_name"]]().run(parent,args["callback"])

    def process(self, callback):
        threads=[]
        for plugin_name in self.PLUGINS.keys():
            print(plugin_name)
            dt = MyThread(self.run_plugin,plugin_name=plugin_name,callback=callback)
            dt.start()
            dt.setName(plugin_name)
            threads.append(dt)
        return threads

    @classmethod
    def plugin_register(cls, plugin_name):
        def wrapper(plugin):
            cls.PLUGINS.update({plugin_name:plugin})
            return plugin
        return wrapper
            
          

#app/main.py

            
              #coding=utf-8

import queue

from .MyThread import MyThread
from .platform import DataManagerProcessor

result_queue = queue.Queue()

#異步寫入隊(duì)列
def updateDB(result):
    result_queue.put(result)

#判斷插件任務(wù)線程是否結(jié)束
def isAllTasksCompleted(threads):
    for t in threads:
        if t.is_alive():
            return False
    return True

def syncDB(parent,args):
    threads=args["threads"]
    while True:
        if not result_queue.empty():
            data=result_queue.get()
            print("*************************")
            print(data)
            print("*************************")
            result_queue.task_done()
        elif isAllTasksCompleted(threads):
            break


def main():
    processor = DataManagerProcessor()
    threads=processor.process(updateDB)
    # for t in threads:
    #     t.join()

    syncThread=MyThread(syncDB,threads=threads)
    syncThread.start()
    syncThread.join()


    print("Done")
            
          

#app/__init__.py

            
              from .plugins import *
            
          

#run.py

            
              from app.main import main

main()
            
          

插件編寫

#app/plugins/plugin1.py

            
              from app.platform import DataManagerProcessor

@DataManagerProcessor.plugin_register('plugin1')
class plugin1(object):
   
    def crawl_data(self,callback):
        callback(1)#實(shí)時(shí)上報(bào)數(shù)據(jù)

    #parent 是線程對(duì)象,可以隨時(shí)停止任務(wù)
    def run(self, parent,callback):
        print(parent.thread_stop)
        self.crawl_data(callback)
        
        

if __name__ == '__main__':
    def test(result):
        print(result)
    plugin1().crawl_data(result)
            
          

#app/plugins/plugin2.py

            
              from app.platform import DataManagerProcessor

@DataManagerProcessor.plugin_register('plugin1')
class plugin2(object):
   
    def crawl_data(self,callback):
        callback(2)#實(shí)時(shí)上報(bào)數(shù)據(jù)

    #parent 是線程對(duì)象,可以隨時(shí)停止任務(wù)
    def run(self, parent,callback):
        print(parent.thread_stop)
        self.crawl_data(callback)
        
        

if __name__ == '__main__':
    def test(result):
        print(result)
    plugin2().crawl_data(result)
            
          

#app/plugins/__init__.py

            
              __all__ = ['plugin1', 'plugin2']
            
          

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 丁青县| 浪卡子县| 大田县| 芜湖县| 宜都市| 墨江| 太仓市| 上高县| 东兰县| 洛宁县| 冕宁县| 边坝县| 平泉县| 景泰县| 崇阳县| 密山市| 特克斯县| 上虞市| 陆良县| 磴口县| 潮州市| 鲜城| 泉州市| 肃南| 黑龙江省| 临高县| 玉溪市| 嘉鱼县| 涪陵区| 竹北市| 鄂温| 浮山县| 大同市| 高邮市| 宁德市| 贵德县| 临澧县| 方城县| 正镶白旗| 正蓝旗| 高安市|