Webapi、複数のエントリを定期的にポーリングする方法、複数のスレッドによる同時処理を実現する方法。

ビジネス要件を次の図に示します。ビジネスは、webapiを介してリアルタイムでタスクを受信して​​処理する必要があり、データベースを定期的にポーリングする必要があります。また
、統合と促進のために、ソケットからデータを受信する必要があります。その後のプログラミングとパフォーマンスの向上分析、プログラム構造設計は次のとおりです。

ここに画像の説明を挿入

分析結果は以下のとおりです。
ここに画像の説明を挿入
データ処理スレッドは同じタスクであり、スレッド数に関係なくクラスでもあります。

ビジネスエントリは、特定の状況に応じて実装する必要があります。エントリはスレッドであり、タスクの内容は異なります。複数のクラスである必要があります。

このプログラムはPythonによって実装され、webapiはtornadoフレームワークを使用し、
タイミングループは単純なwhileループです。

メインプログラムの開始コードstart.py

# 所有的数据都从 JobList 中获取的.
jobList =  JobList()


# 启动主干活的线程1
scoring =  DoScoringThread(jobList)
scoring.start()

# 启动主干活的线程2
scoring2 =  DoScoringThread(jobList)
scoring2.start()


# 启动主干活的线程3
scoring3 =  DoScoringThread(jobList)
scoring3.start()


# 从数据库循环取任务的线程
dbing =  FromDBLoopGetJobThread(jobList)
dbing.start()

# 开启webapi服务
WebAPIServer.StartWebAPIServe(jobList)

仕事の糸...


import threading 
# from common.Job.JobList import GetOneJob
from common.Job.ScoringBLL import DoScoring
import time
import traceback

#干活的线程
class  DoScoringThread(threading.Thread):
    '''
        自动打分线程
    '''
    def __init__(self,jobList): 
        threading.Thread.__init__(self)
        self.jobList = jobList

        
    def run(self):
        while(True):     #这一层确保发生错误仍然执行循环
            try:
                self.DoLoop() #发生错误仍然执行循环
            except Exception as ex:
                traceback.print_exc()
                time.sleep(0.5) # 防止死循环消耗大量资源

    def DoLoop(self): 
        #循环去任务池中取任务
        while(True):
            jobkey = self.jobList.GetOneJob() 
            if(jobkey == None):
                print("线程", threading.currentThread().ident,"未取到任务,休眠...")
                self.jobList.getThreadEvent().wait()  # 没任务等待主线程的通知
            else:
                print("线程", threading.currentThread().ident,"取到任务,开始执行...")
                DoScoring(jobkey)# 

  

データベースのタスクをポーリングするスレッド。

import threading  
import time
import traceback
# from common.Job.JobList import AppendJob


class  FromDBLoopGetJobThread(threading.Thread):
    '''
        自动从数据库取任务的线程
    '''
    def __init__(self,jobList):
        self.jobList = jobList
        threading.Thread.__init__(self)  

    def run(self):
        while(True):     #这一层确保发生错误仍然执行循环
            try:
                self.DoLoop() #发生错误仍然执行循环
            except Exception as ex:
                traceback.print_exc()
                time.sleep(0.5) # 防止死循环消耗大量资源  


    def DoLoop(self):
        
        #循环去任务池中取任务
        while(True):
            # 从数据库取数据
            jobkey = "任务1111"
            
            print("从DB新增任务",jobkey)

            self.jobList.AppendJob(jobkey)  #只要调用
            time.sleep(1)

  

実際、入り口の呼び出しは非常に簡単です。以下のコードを呼び出すだけです。他のコードは無料でプレイできます。

   jobList.AppendJob(jobkey) # 添加的时候, 内部默认会通知工作的线程.

コアコードはこのクラスJobList.pyです

import threading


class  JobList( ):
    '''
        工作任务列表
    '''
    def __init__(self):
       self.threadevent =  threading.Event()
       self.lock = threading.RLock()
       self.JobList=[] # 任务列表
 

    def AppendJob(self,jobkey):
      '''
      追加任务
      '''   
      self.lock.acquire() #加锁

      self.JobList.append(jobkey)

      self.lock.release() # 解锁
      self.threadevent.set() # 通知所有工作的线程, 有活干了, 线程就会从wait后面开始执行调用 GetOneJob 来获取任务


    def getThreadEvent(self):
      '''
         获取事件,一般是工作线程用来调用wait用
      ''' 
      return self.threadevent
 

    def GetOneJob(self):
      '''
      获取一个任务
      '''    
      self.lock.acquire()#加锁

      jobkey = None
      if len(self.JobList) ==  0:
         self.threadevent.clear() # 通知所有工作的线程, 已经没有任务了不要再来取了. 其它线程运行到wait的时候就会挂起, 直到set被调用
      else:
         jobkey = self.JobList.pop(0)

      self.lock.release()# 释放线程锁
      return jobkey  

 

WebApiのエントリコードも非常にシンプルなので、投稿しません。
適切な場所に電話してください。

   jobList.AppendJob(jobkey) # 添加的时候, 内部默认会通知工作的线程.

マルチスレッドで主にthreading.Event()とthreading.RLock()を使用します。記事
https://blog.csdn.net/qq_34139994/article/details/108416241
https://blog.csdn.net/ u012067766 / articleを参照してください。/ details / 79734630

おすすめ

転載: blog.csdn.net/phker/article/details/112945900