ビジネス要件を次の図に示します。ビジネスは、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