时间:2024-06-11 00:25
人气:
作者:admin
Purpose: Framework Core Multi-Threading Support
- this unit is a part of the Open Source Synopse mORMot framework 2, licensed under a MPL/GPL/LGPL three license - see LICENSE.md
目的:框架核心多线程支持
| Unit Name | Description | |
|---|---|---|
| mormot.core.base | Framework Core Shared Types and RTL-like Functions | 框架核心共享类型和类似RTL的函数 |
| mormot.core.buffers | Framework Core Low-Level Memory Buffer Process | 框架核心低级内存缓冲区处理 |
| mormot.core.data | Framework Core Low-Level Data Processing Functions | 框架核心低级数据处理函数 |
| mormot.core.json | Framework Core Low-Level JSON Processing | 框架核心低级JSON处理 |
| mormot.core.log | Framework Core Logging | 框架核心日志记录 |
| mormot.core.os | Framework Core Low-Level Wrappers to the Operating-System API | 框架核心对操作系统API的低级包装器 |
| mormot.core.perf | Framework Core Performance and Monitoring Classes | 框架核心性能和监视类 |
| mormot.core.rtti | Framework Core Low-Level Cross-Compiler RTTI Definitions | 框架核心低级跨编译器RTTI定义 |
| mormot.core.text | Framework Core Low-Level Text Processing | 框架核心低级文本处理 |
| mormot.core.unicode | Framework Core Low-Level Unicode UTF-8 UTF-16 Ansi Conversion | 框架核心低级Unicode UTF-8 UTF-16 Ansi转换 |
| mormot.core.variants | Framework Core Low-Level Variants / TDocVariant process | 框架核心低级变量/TDocVariant处理 |
TSynThread
TSynThreadPoolWorkThread
TNotifiedThreadTLoggedThread
TLoggedWorkThreadTThreadAbstract
TSynBackgroundThreadAbstract
TSynBackgroundThreadProcess
TSynBackgroundTimer
TSynBackgroundThreadMethodAbstract
TSynParallelProcessThread
TSynBackgroundThreadProcedure
TSynBackgroundThreadMethod
TSynBackgroundThreadEventTThread
TSynPersistentStoreTSynQueue
TSynPersistentLockTSynParallelProcess
TSynPersistent
TBlockingProcessPool
TBlockingProcess
TBlockingProcessPoolItem
TSynEventTObject
TSynThreadPool
TPendingTaskList
TInterfacedObjectWithCustomCreate
TLockedDocVariantIInterface
ILockedDocVariant
ESynException
ESynThread
mormot.core.threads class hierarchy

| Objects | Description | |
|---|---|---|
| ESynThread | Exception class raised by this unit | 由本单元引发的异常类 |
| ILockedDocVariant | Ref-counted interface for thread-safe access to a TDocVariant document | 用于线程安全访问TDocVariant文档的引用计数接口 |
| TBlockingProcess | A semaphore used to wait for some process to be finished | 一个计数信号量,用于等待某个进程完成 |
| TBlockingProcessPool | Manage a pool of TBlockingProcessPoolItem instances | 管理一组TBlockingProcessPoolItem实例 |
| TBlockingProcessPoolItem | A semaphore used in the TBlockingProcessPool | 在TBlockingProcessPool中使用的计数信号量 |
| TLockedDocVariant | Allows thread-safe access to a TDocVariant document | 允许线程安全地访问TDocVariant文档 |
| TLoggedThread | Abstract class to implement a thread with logging notifications | 实现带有日志通知的线程的抽象类 |
| TLoggedWorkThread | A class able to run some process in a background thread | 能够在后台线程中运行某些进程的类 |
| TNotifiedThread | Abstract class to implement a thread with start/stop notifications | 实现带有启动/停止通知的线程的抽象类 |
| TPendingTaskList | Thread-safe list of tasks, stored as RawByteString, with a timestamp | 线程安全的任务列表,以RawByteString形式存储,带有时间戳 |
| TPendingTaskListItem | Internal item definition, used by TPendingTaskList storage | TPendingTaskList存储的内部项目定义 |
| TSynBackgroundThreadAbstract | Abstract TThread with its own execution content | 带有自己的执行内容的TThreadAbstract |
| TSynBackgroundThreadEvent | Allow background thread process of a method callback | 允许在后台线程中处理方法回调 |
| TSynBackgroundThreadMethod | Allow background thread process of a variable TThreadMethod callback | 允许在后台线程中处理可变TThreadMethod回调 |
| TSynBackgroundThreadMethodAbstract | Abstract TThread able to run a method in its own execution content | 能够在自己的执行内容中运行方法的抽象TThread |
| TSynBackgroundThreadProcedure | Allow background thread process of a procedure callback | 允许在后台线程中处理过程回调 |
| TSynBackgroundThreadProcess | TThread able to run a method at a given periodic pace | 能够在给定周期速率下运行方法的TThread |
| TSynBackgroundTimer | TThread able to run one or several tasks at a periodic pace in a background thread | 能够在后台线程中以周期速率运行一个或多个任务的TThread |
| TSynBackgroundTimerTask | Used by TSynBackgroundTimer internal registration list | 用于TSynBackgroundTimer内部注册列表 |
| TSynParallelProcess | Allow parallel execution of an index-based process in a thread pool | 允许在线程池中并行执行基于索引的进程 |
| TSynParallelProcessThread | Thread executing process for TSynParallelProcess | 为TSynParallelProcess执行进程的线程 |
| TSynQueue | Thread-safe FIFO (First-In-First-Out) in-order queue of records | 线程安全的FIFO(先入先出)有序记录队列 |
| TSynThread | A simple TThread with a "Terminate" event run in the thread context | 一个简单的TThread,带有在线程上下文中运行的"Terminate"事件 |
| TSynThreadPool | A simple Thread Pool, used e.g. for fast handling HTTP/1.0 requests | 一个简单的线程池,例如用于快速处理HTTP/1.0请求 |
| TSynThreadPoolWorkThread | Defines the work threads used by TSynThreadPool | 定义TSynThreadPool使用的工作线程 |
| TThreadAbstract | Abstract parent of all TThread inherited classes | 所有TThread继承类的抽象父类 |
ESynThread = class(ESynException)
本单元引发的异常类
TSynQueue = class(TSynPersistentStore)
*线程安全的FIFO(先入先出)记录有序队列
TDynArray存储,具有滑动算法,比FPC或Delphi的TQueue或简单的TDynArray.Add/Delete更高效TSynPersistentStore二进制持久化constructor Create(aTypeInfo: PRttiInfo; const aName: RawUtf8 = ''); reintroduce; virtual;
*初始化队列存储
destructor Destroy; override;
*销毁存储
WaitPopFinalize*function Capacity: integer;
*返回当前在内存中预留的槽位数
capacityfunction Count: integer;
*返回当前存储在此队列中的项数
Pending*function Peek(out aValue): boolean;
*从队列中按FIFO(先入先出)方式查找一个项
*如果队列中有一些当前pending的项,则返回true
function Pop(out aValue): boolean;
*从队列中按FIFO(先入先出)方式提取一个项
function PopEquals(aAnother: pointer; aCompare: TDynArraySortCompare; out aValue): boolean;
*从队列中按FIFO(先入先出)方式提取一个匹配的项
pending项与aAnother值进行比较*function WaitPeekLocked(aTimeoutMS: integer; const aWhenIdle: TThreadMethod): pointer;
*等待从队列中按FIFO(先入先出)方式查找一个项
pending项的指针Pop(),并最终调用Safe.ReadWriteUnlock*等待并从队列中按FIFO(先入先出)方式提取一个项
pending项,则返回trueWaitPopFinalize,则返回falsepending项(例如,当多个线程将项放入队列时可以使用)procedure Clear;
*删除当前存储在此队列中的所有项,并清空其capacity
procedure Push(const aValue);
*将一个项存储到队列中
procedure Save(out aDynArrayValues; aDynArray: PDynArray = nil); overload;
*使用存储的队列项初始化一个动态数组
*确保任何pending或未来的WaitPop()方法立即返回false
Destroy析构函数调用TPendingTaskListItem = packed record
Timestamp: Int64;
当TPendingTaskList.GetTimestamp达到此值时,应执行task
TPendingTaskList = class(TObject)
*线程安全的任务列表,以RawByteString形式存储,并带有时间戳
constructor Create; reintroduce;
默认返回GetTickCount64来初始化列表内存和资源
function NextPendingTask: RawByteString; virtual;
*检索下一个待处理task
task,则返回''procedure AddTask(aMilliSecondsDelayFromNow: integer; const aTask: RawByteString); virtual;
procedure AddTasks(const aMilliSecondsDelays: array of integer; const aTasks: array of RawByteString);
*指定任务之间的毫秒延迟后Append多个任务
task需要多长时间——也就是说,aMilliSecondsDelays不是绝对延迟*procedure Clear; virtual;
清除所有待处理任务
property Count: integer read GetCount;
当前定义了多少个待处理任务
property Task: TPendingTaskListItemDynArray read fTask;
*直接低级访问内部task列表
Count属性来检索存储的确切项数Timestamp存储,即第一个项目是NextPendingTask方法将返回的下一个项目*property Timestamp: Int64 read GetTimestamp;
*访问内部TPendingTaskListItem.Timestamp存储的值
GetTickCount64,在Windows下典型分辨率为16毫秒*ILockedDocVariant = interface(IInterface)
*用于线程安全访问TDocVariant文档的引用计数接口
TLockedDocVariant实现,用于IoC/DI解析function AddExistingProp(const Name: RawUtf8; var Obj: variant): boolean;
*将现有属性value添加到给定的TDocVariant文档对象
Value对添加到Objlock,但无论是否返回FALSE,总是会释放lock(参见AddExistingPropOrLock)*function AddExistingPropOrLock(const Name: RawUtf8; var Obj: variant): boolean;
*将现有属性value添加到给定的TDocVariant文档对象
Value对添加到Obj,使用内部lock确保线程安全AddNewPropAndUnlock()释放lockif not cache.AddExistingPropOrLock('Articles',Scope) then
cache.AddNewPropAndUnlock('Articles',GetArticlesFromDB,Scope);
这里GetArticlesFromDB会在主要lock内部执行
function Copy: variant;
对内部TDocVariant文档对象或数组进行线程安全的复制
function Exists(const Name: RawUtf8; out Value: Variant): boolean;
*按名称检查和返回一个给定的属性
value填充到Value中,使用内部lock确保线程安全lock:如果你想要添加缺失的value,请使用ExistsOrLock()*function ExistsOrLock(const Name: RawUtf8; out Value: Variant): boolean;
*按名称检查和返回一个给定的属性
value填充到Value中,使用内部lock确保线程安全lock:调用者随后应通过ReplaceAndUnlock()释放lock*对关联的线程安全互斥锁进行低级访问
function ToJson(HumanReadable: boolean = false): RawUtf8;
将存储的值保存为UTF-8编码的JSON对象
procedure AddItem(const Value: variant);
*将value添加到内部TDocVariant文档数组
Exists/AddExistingPropOrLock或AddExistingProp)结合使用*procedure AddNewProp(const Name: RawUtf8; const Value: variant; var Obj: variant);
*将属性value添加到给定的TDocVariant文档对象
AddNewPropAndUnlock不同lock确保线程安全valueif not cache.AddExistingProp('Articles',Scope) then
cache.AddNewProp('Articles',GetArticlesFromDB,Scope);
这里GetArticlesFromDB会在主lock之外执行
procedure AddNewPropAndUnlock(const Name: RawUtf8; const Value: variant; var Obj: variant);
*将属性value添加到给定的TDocVariant文档对象以及内部存储的文档,然后释放之前的lock
AddExistingPropOrLock()返回false,即在一个已锁定的实例上执行*procedure Clear;
删除所有存储的属性
procedure ReplaceAndUnlock(const Name: RawUtf8; const Value: Variant; out LocalValue: Variant);
*通过属性名称设置value,并设置本地副本
if not cache.ExistsOrLock('prop',local) then
cache.ReplaceAndUnlock('prop',newValue,local);
ExistsOrLock()返回false,即在一个已锁定的实例上执行*通过此属性安全地访问文档字段
EDocVariant异常value进行线程安全的副本*TLockedDocVariant = class(TInterfacedObjectWithCustomCreate)
TInterfacedObjectWithCustomCreate继承,因此您可以定义一个mormot.core.interfaces.pas TInjectableObject的已发布属性为ILockedDocVariant,以便此类可以自动注入*constructor Create(options: TDocVariantOptions); reintroduce; overload;
使用相应的选项初始化线程安全的文档存储
constructor Create(options: TDocVariantModel); reintroduce; overload;
从给定的模板初始化线程安全的文档存储
constructor Create; overload; override;
*使用快速的TDocVariant初始化线程安全的文档
Create(true)或Create(JSON_FAST)TInterfacedObjectWithCustomCreate的默认构造函数,例如在IoC/DI解析期间调用*destructor Destroy; override;
销毁存储
function AddExistingProp(const Name: RawUtf8; var Obj: variant): boolean;
*向给定的TDocVariant文档对象添加一个已存在的属性value
Value对添加到Objlock,但无论是否返回FALSE,总是会释放lock(参见AddExistingPropOrLock)*function AddExistingPropOrLock(const Name: RawUtf8; var Obj: variant): boolean;
*向给定的TDocVariant文档对象添加一个已存在的属性value
Value对添加到ObjAddNewPropAndUnlock()function Copy: variant;
对内部TDocVariant文档对象或数组进行线程安全的复制
function Exists(const Name: RawUtf8; out Value: Variant): boolean;
按名称检查和返回一个给定的属性
function ExistsOrLock(const Name: RawUtf8; out Value: Variant): boolean;
*按名称检查和返回一个给定的属性
valueReplaceAndUnlock()function Lock: TAutoLocker;
对关联的线程安全互斥锁进行低级访问
function ToJson(HumanReadable: boolean = false): RawUtf8;
*将存储的value保存为UTF-8编码的JSON对象
VariantSaveJson()的包装*procedure AddItem(const Value: variant);
将value添加到内部TDocVariant文档数组
procedure AddNewProp(const Name: RawUtf8; const Value: variant; var Obj: variant);
*向给定的TDocVariant文档对象添加一个属性value
AddNewPropAndUnlock不同lock确保线程安全value*向给定的TDocVariant文档对象和内部存储的文档添加一个属性value
procedure Clear;
删除所有存储的属性
*将通过此属性安全地访问文档字段
EDocVariant异常TThreadAbstract = class(TThread)
*所有TThread继承类的抽象父类
procedure Terminate; reintroduce;
重新引入以调用TerminatedSet
Terminate调用*property Terminated;
定义为public,因为可能用于terminate处理方法
TSynBackgroundThreadAbstract = class(TThreadAbstract)
*具有自身执行内容的抽象TThread
TSynBackgroundThreadMethodAbstract / TSynBackgroundThreadEvent / TSynBackgroundThreadMethod,并提供更方便的回调*constructor Create(const aThreadName: RawUtf8; const OnBeforeExecute: TOnNotifyThread = nil; const OnAfterExecute: TOnNotifyThread = nil; CreateSuspended: boolean = false); reintroduce;
*初始化线程
TSynLogFamily.OnThreadEnded*destructor Destroy; override;
*释放使用的资源
WaitForNotExecuting(100)以确保正确终结*function SleepOrTerminated(MS: cardinal): boolean;
*Sleep()的安全版本,不会中断线程进程
procedure TerminatedSet; override;
*正确终止线程
procedure WaitForNotExecuting(maxMS: integer = 500);
*等待Execute/ExecuteLoop结束(即fExecute<>exRun)
Destroy中使用,以避免任何GPF并确保干净地终结*property Pause: boolean read fExecuteLoopPause write SetExecuteLoopPause;
*临时停止ExecuteLoop的执行,直到设置为false
TSynBackgroundTimer使用,以延迟后台任务的进程*property ProcessEvent: TSynEvent read fProcessEvent;
*访问与低级别相关的事件,用于通知后台线程任务执行
TSynBackgroundThreadMethodAbstract = class(TSynBackgroundThreadAbstract)
*抽象TThread,能够在其自己的执行内容中运行方法
TRestClientUri.OnIdle如何处理这种情况TSynBackgroundThreadEvent / TSynBackgroundThreadMethod并提供更方便的回调*constructor Create(const aOnIdle: TOnIdleSynBackgroundThread; const aThreadName: RawUtf8; const OnBeforeExecute: TOnNotifyThread = nil; const OnAfterExecute: TOnNotifyThread = nil); reintroduce;
*初始化线程
RunAndWait()返回destructor Destroy; override;
终结线程
function RunAndWait(OpaqueParam: pointer): boolean;
*在后台线程中异步启动Process抽象方法
OnIdle()回调OnIdle()回调引发的竞态条件),则返回falseproperty OnAfterProcess: TOnNotifyThread read fOnAfterProcess write fOnAfterProcess;
在每个Process之后在Execute中触发的可选回调事件
property OnBeforeProcess: TOnNotifyThread read fOnBeforeProcess write fOnBeforeProcess;
在每个Process之前在Execute中触发的可选回调事件
property OnIdle: TOnIdleSynBackgroundThread read fOnIdle write fOnIdle;
*在远程阻塞进程期间循环执行的回调事件,例如,在请求时间较长时刷新UI
OnIdle未设置(即等于nil),它将简单地等待后台进程完成,直到RunAndWait()返回*property OnIdleBackgroundThreadActive: boolean read GetOnIdleBackgroundThreadActive;
*如果后台线程处于活动状态,并且在处理过程中调用了OnIdle事件,则为TRUE
TSynBackgroundThreadEvent = class(TSynBackgroundThreadMethodAbstract)
允许后台线程处理方法回调
constructor Create(const aOnProcess: TOnProcessSynBackgroundThread; const aOnIdle: TOnIdleSynBackgroundThread; const aThreadName: RawUtf8); reintroduce;
*初始化线程
property OnProcess: TOnProcessSynBackgroundThread read fOnProcess write fOnProcess;
*提供一个在后台线程中执行的方法处理程序
TSynBackgroundThreadMethod = class(TSynBackgroundThreadMethodAbstract)
允许后台线程处理可变的TThreadMethod回调
procedure RunAndWait(Method: TThreadMethod); reintroduce;
*运行一次提供的TThreadMethod回调
TSynBackgroundThreadProcedure = class(TSynBackgroundThreadMethodAbstract)
允许后台线程处理过程回调
constructor Create(aOnProcess: TOnProcessSynBackgroundThreadProc; const aOnIdle: TOnIdleSynBackgroundThread; const aThreadName: RawUtf8); reintroduce;
*初始化线程
property OnProcess: TOnProcessSynBackgroundThreadProc read fOnProcess write fOnProcess;
*提供一个在后台线程中执行的过程处理程序
TSynBackgroundThreadProcess = class(TSynBackgroundThreadAbstract)
能够在给定周期速率下运行方法的TThread
constructor Create(const aThreadName: RawUtf8; const aOnProcess: TOnSynBackgroundThreadProcess; aOnProcessMS: cardinal; const aOnBeforeExecute: TOnNotifyThread = nil; const aOnAfterExecute: TOnNotifyThread = nil; aStats: TSynMonitorClass = nil; CreateSuspended: boolean = false); reintroduce; virtual;
*初始化线程以进行周期性任务处理
destructor Destroy; override;
终结线程并等待其结束
property OnException: TNotifyEvent read fOnException write fOnException;
property OnProcess: TOnSynBackgroundThreadProcess read fOnProcess;
访问周期性任务的实现事件
property OnProcessMS: cardinal read fOnProcessMS write fOnProcessMS;
访问周期性任务处理的延迟(以毫秒为单位)
property Stats: TSynMonitor read fStats;
*处理统计信息
TSynBackgroundTimerTask = record
由TSynBackgroundTimer内部注册列表使用
TSynBackgroundTimer = class(TSynBackgroundThreadProcess)
*能够在后台线程中以周期速率运行一个或多个任务的TThread
TRestBackgroundTimer,由TRest.TimerEnable/TimerDisable方法使用text消息FIFO队列expect更新某些GUI,你应该使用TTimer组件(例如,周期为200ms),因为TSynBackgroundTimer将使用自己的独立线程*constructor Create(const aThreadName: RawUtf8; const aOnBeforeExecute: TOnNotifyThread = nil; aOnAfterExecute: TOnNotifyThread = nil; aStats: TSynMonitorClass = nil; aLogClass: TSynLogClass = nil); reintroduce; virtual;
*初始化线程以进行周期性taskprocessing
TRestBackgroundTimer.Create所做的那样*destructor Destroy; override;
终结线程
function DeQueue(const aOnProcess: TOnSynBackgroundTimerProcess; const aMsg: RawUtf8): boolean;
*从processing列表中移除一条消息
Enable()方法进行注册function Disable(const aOnProcess: TOnSynBackgroundTimerProcess): boolean;
*取消定义一个在周期秒数上运行的task
Enable()方法进行注册task未注册则返回falseTRestServer的TimerEnable/TimerDisable方法及其TSynBackgroundTimer线程*function EnQueue(const aOnProcess: TOnSynBackgroundTimerProcess; const aMsgFmt: RawUtf8; const Args: array of const; aExecuteNow: boolean = false): boolean; overload;
*在task的下次执行期间添加一条格式化消息进行处理
Enable()方法进行注册task未注册则返回false*function EnQueue(const aOnProcess: TOnSynBackgroundTimerProcess; const aMsg: RawUtf8; aExecuteNow: boolean = false): boolean; overload;
*在task的下次执行期间添加一条消息进行处理
Enable()方法进行注册task未注册则返回false*function ExecuteNow(const aOnProcess: TOnSynBackgroundTimerProcess): boolean;
*立即执行一个task,不等待下一个aOnProcessSecs的发生
function ExecuteOnce(const aOnProcess: TOnSynBackgroundTimerProcess): boolean;
*立即执行一个task,不等待下一个aOnProcessSecs的发生
Enable()方法进行注册*procedure Enable(const aOnProcess: TOnSynBackgroundTimerProcess; aOnProcessSecs: cardinal);
*定义一个在周期秒数上运行的task的处理方法
TRest的TimerEnable/TimerDisable方法及其关联的BackgroundTimer线程*procedure WaitUntilNotProcessing(timeoutsecs: integer = 10);
等待直到没有后台task正在处理
property Processing: boolean read fProcessing;
如果当前正在处理某些tasks,则返回TRUE
property Tasks: TDynArrayLocked read fTasks;
对内部task列表的线程安全包装的低级访问 Low-level access to the internal task list wrapper and safe
TBlockingProcess = class(TSynEvent)
*一个信号量,用于等待某个进程完成
TBlockingCallback中使用constructor Create(aTimeOutMs: integer); reintroduce; overload; virtual;
*初始化信号量实例
constructor Create(aTimeOutMs: integer; aSafe: PSynLocker); reintroduce; overload; virtual;
*重写以reset相关参数并初始化信号量实例
destructor Destroy; override;
终结实例
*当后台进程完成时应该被调用
WaitFor方法返回function Reset: boolean; virtual;
*只是一个包装器,用于将内部Event状态重置为evNone
WaitFor/NotifyFinished过程后,可以使用它来重用同一个TBlockingProcess实例WaitFor过程,则返回FALSE*function WaitFor: TBlockingEvent; reintroduce; overload; virtual;
*调用以等待NotifyFinished()被调用或触发超时
function WaitFor(TimeOutMS: integer): TBlockingEvent; reintroduce; overload;
*调用以等待NotifyFinished()被调用或触发超时
property Event: TBlockingEvent read fEvent;
*进程的当前状态
property TimeOutMs: integer read fTimeOutMS;
在构造函数级别定义的超时周期,以毫秒为单位
TBlockingProcessPoolItem = class(TBlockingProcess)
*在TBlockingProcessPool中使用的信号量
property Call: TBlockingProcessPoolCall read fCall;
*一个唯一标识符,当被TBlockingProcessPool拥有时,用于标识每次执行
这样,TBlockingProcessPoolItem类作为 TBlockingProcess的子类,在继承其信号量功能的基础上,增加了 Call属性来支持在 TBlockingProcessPool中的唯一标识,使得在池化管理信号量时能够区分不同的执行实例。通过 Reset方法,可以重置信号量的状态以及 Call属性,以便循环利用。
TBlockingProcessPool = class(TSynPersistent)
*管理一组TBlockingProcessPoolItem实例
TBlockingProcessPoolCall值进行标识TEvent系统资源*constructor Create(aClass: TBlockingProcessPoolItemClass = nil); reintroduce;
为给定的实现类设置TBlockingProcessPoolItem.Call并初始化池
destructor Destroy; override;
*终结池
function FromCall(call: TBlockingProcessPoolCall; locked: boolean = false): TBlockingProcessPoolItem; virtual;
*根据其调用标识符检索TBlockingProcess
TBlockingProcess的一些附加参数,然后调用NotifyFinished来释放调用者的WaitForfunction NewProcess(aTimeOutMs: integer): TBlockingProcessPoolItem; virtual;
*从内部池中预订一个TBlockingProcess
TSynParallelProcessThread = class(TSynBackgroundThreadMethodAbstract)
TSynParallelProcess = class(TSynPersistentLock)
*允许在线程池中并行执行基于索引的过程
constructor Create(ThreadPoolCount: integer; const ThreadName: RawUtf8; const OnBeforeExecute: TOnNotifyThread = nil; const OnAfterExecute: TOnNotifyThread = nil; MaxThreadPoolCount: integer = 32); reintroduce; virtual;
*初始化线程池
ThreadPoolCount为0,则不会创建线程,进程将在当前线程中执行*destructor Destroy; override;
终结线程池
procedure ParallelRunAndWait(const Method: TOnSynParallelProcess; MethodCount: integer; const OnMainThreadIdle: TNotifyEvent = nil);
*并行运行一个方法,并等待执行完成
split执行Method[0..MethodCount-1]property ParallelRunCount: integer read fParallelRunCount;
已激活的线程数
property ThreadName: RawUtf8 read fThreadName;
一些text标识符,用于区分每个拥有的线程
property ThreadPoolCount: integer read fThreadPoolCount;
当前在此实例线程池中的线程数
TSynThread = class(TThreadAbstract)
*一个简单的TThread,具有在线程上下文中运行的“Terminate”事件
constructor Create(CreateSuspended: boolean); reintroduce; virtual;
初始化线程实例,处于非挂起状态
function SleepOrTerminated(MS: cardinal): boolean;
*Sleep()的安全版本,不会中断线程进程
property StartNotified: TObject read fStartNotified write fStartNotified;
确保仅在执行了NotifyThreadStart后调用fOnThreadTerminate
TNotifiedThread = class(TSynThread)
*抽象类,用于实现具有启动/停止通知的线程
THttpServer、THttpApiServer或TWebSocketServer(如mormot.net.websock中定义)*constructor Create(CreateSuspended: boolean; const OnStart, OnStop: TOnNotifyThread; const ProcessName: RawUtf8); reintroduce; virtual;
初始化服务器实例,处于非挂起状态
procedure SetServerThreadsAffinityPerCpu( const log: ISynLog; const threads: TThreadDynArray);
*将每个线程分配给单个逻辑CPU核心
HTTP服务器,它可能确保具有短生命周期请求和高线程数的更好可扩展性*procedure SetServerThreadsAffinityPerSocket( const log: ISynLog; const threads: TThreadDynArray);
*将每个线程分配给单个硬件CPU套接字
HTTP服务器,它可能确保在具有多个物理CPU包的复杂硬件上更好的可扩展性 - 但它非常挑剔,因此仅应在实际硬件上进行适当测试后启用*TLoggedThread = class(TSynThread)
抽象类,用于实现具有日志通知的线程
constructor Create(CreateSuspended: boolean; Logger: TSynLogClass; const ProcName: RawUtf8); reintroduce; virtual;
初始化服务器实例,处于非挂起状态
procedure TerminateAndWaitFinished(TimeOutMs: integer = 5000); virtual;
通知线程终止,并等待DoExecute完成
property LogClass: TSynLogClass read fLogClass;
关联的日志类
property ProcessName: RawUtf8 read fProcessName;
此线程的名称,如提供给SetCurrentThreadName()的
TLoggedWorkThread = class(TLoggedThread)
*一个能够在后台线程中运行某些进程的类
constructor Create(Logger: TSynLogClass; const ProcessName: RawUtf8; const NameValuePairs: array of const; const OnExecute: TOnLoggedWorkProcess; const OnExecuted: TNotifyEvent = nil); reintroduce; overload;
*此构造函数将直接在后台启动线程
constructor Create(Logger: TSynLogClass; const ProcessName: RawUtf8; Sender: TObject; const OnExecute: TNotifyEvent; const OnExecuted: TNotifyEvent = nil); reintroduce; overload;
*此构造函数将直接在后台启动线程
TSynThreadPoolWorkThread = class(TSynThread)
定义了由TSynThreadPool使用的工作线程
constructor Create(Owner: TSynThreadPool); reintroduce;
异常安全地调用fOwner.Task()来初始化线程
destructor Destroy; override;
终结线程
procedure Execute; override;
将循环等待任何待处理的任务,并执行fOwner.Task()
property Owner: TSynThreadPool read fOwner;
关联的线程池
TSynThreadPool = class(TObject)
*一个简单的线程池,例如用于快速处理HTTP/1.0请求
constructor Create(NumberOfThreads: integer = 32; aOverlapHandle: THandle = INVALID_HANDLE_VALUE; const aName: RawUtf8 = '');
*使用提供的线程数初始化线程池
Push()返回true*destructor Destroy; override;
关闭线程池,释放所有关联的线程
function Push(aContext: pointer; aWaitOnContention: boolean = false): boolean;
*让线程池处理一个任务(指定为指针)
Create(aQueuePendingContext=false)(调用者应稍后重试),则返回false;如果在Create中aQueuePendingContext为true,或者使用了IOCP,则提供的上下文将被添加到内部列表,并在可能时处理ContentionAbortDelay毫秒并重试将任务排队*property ContentionAbortCount: cardinal read fContentionAbortCount;
*由于线程池争用而被拒绝的任务数量
property ContentionAbortDelay: integer read fContentionAbortDelay write fContentionAbortDelay;
*由于争用而拒绝连接的毫秒延迟
property ContentionCount: cardinal read fContentionCount;
*线程池等待队列中可用槽位的次数
ContentionAbortDelayContentionTime来计算平均争用时间*property ContentionTime: Int64 read fContentionTime;
*等待队列中可用槽位的总毫秒数
ContentionAbortDelayproperty RunningThreads: integer read fRunningThreads;
*当前在此线程池中处理任务的线程数
WorkThreadCount之间*property WorkThread: TSynThreadPoolWorkThreads read fWorkThread;
对此线程池中定义的线程的低级访问
property WorkThreadCount: integer read fWorkThreadCount;
*线程池中可用的线程数
Create()参数,即默认为32*TBlockingEvent = ( evNone, evWaiting, evTimeOut, evRaised );
TBlockingProcess实例的当前状态
TBlockingProcessPoolCall = type integer;
TBlockingProcessPoolItem信号量*TBlockingProcessPoolItemClass = class of TBlockingProcessPoolItem;
TBlockingProcess的类引用类型(元类)
TEvent = syncobjs.TEvent;
*在此处定义以避免在uses子句中显式链接到syncobjs
TOnIdleSynBackgroundThread = procedure(Sender: TSynBackgroundThreadAbstract; ElapsedMS: integer) of object;
*在后台线程进行远程阻塞处理期间,由TSynBackgroundThreadAbstract在调用者线程中调用的空闲方法
TRestClientUri.Uri(),即使在远程访问缓慢阻塞的情况下也能提供响应的UITOnLoggedWorkProcess = procedure(const Context: TDocVariantData) of object;
由TLoggedWorkThread.Create在后台线程中调用的事件
TOnNotifyThread = procedure(Sender: TThread) of object;
事件原型,例如由TSynBackgroundThreadAbstract和TSynThread回调使用
TOnProcessSynBackgroundThread = procedure(Sender: TSynBackgroundThreadEvent; ProcessOpaqueParam: pointer) of object;
*由TSynBackgroundThreadEvent调用的后台处理方法
TOnProcessSynBackgroundThreadProc = procedure(ProcessOpaqueParam: pointer);
*由TSynBackgroundThreadProcedure调用的后台处理过程
TOnSynBackgroundThreadProcess = procedure(Sender: TSynBackgroundThreadProcess) of object;
由TSynBackgroundThreadProcess定期执行的事件回调
TOnSynBackgroundTimerProcess = procedure(Sender: TSynBackgroundTimer; const Msg: RawUtf8) of object;
*由TSynBackgroundTimer定期执行的事件回调
TOnSynParallelProcess = procedure(IndexStart, IndexStop: integer) of object;
*为TSynParallelProcess实现并行处理过程的回调
TPendingTaskListItemDynArray = array of TPendingTaskListItem;
TSynBackgroundThreadProcessStep = ( flagIdle, flagStarted, flagFinished, flagDestroying );
TSynBackgroundThreadAbstract进程的状态机状态
TSynBackgroundThreadProcessSteps = set of TSynBackgroundThreadProcessStep;
TSynBackgroundThreadAbstract进程的状态机状态集合
TSynBackgroundTimerTaskDynArray = array of TSynBackgroundTimerTask;
保护Msg[]列表存储TSynBackgroundTimer的内部注册列表
TThreadDynArray = array of TThread;
TThread的动态数组
TWaitResult = syncobjs.TWaitResult;
*在此处定义以避免在uses子句中显式链接到syncobjs
THREADPOOL_MAXTHREADS = 256;
允许为TSynThreadPoolWorkThread堆栈分配最多256 * 2MB = 512MB的内存
wrSignaled = syncobjs.wrSignaled;
建议使用mormot.core.os中的TSynEvent,而不是此处定义的TEvent,以避免在uses子句中显式链接到syncobjs
IDE工具RAD Studio 13 Florence重磅发布:64 位