mormot.core.threads--TSynParallelProcess

news/2024/10/6 20:23:43/文章来源:https://www.cnblogs.com/hieroly/p/18289982

mormot.core.threads--TSynParallelProcess

{ ************ 线程池中的并行执行 }type/// TSynParallelProcess 的并行化过程回调// - 如果 0<=IndexStart<=IndexStop,则应执行某些过程TOnSynParallelProcess = procedure(IndexStart, IndexStop: integer) of object;/// 为 TSynParallelProcess 执行过程的线程TSynParallelProcessThread = class(TSynBackgroundThreadMethodAbstract)protectedfMethod: TOnSynParallelProcess; // 回调方法fIndexStart, fIndexStop: integer; // 要处理的索引范围procedure Start(const Method: TOnSynParallelProcess; // 开始执行过程IndexStart, IndexStop: integer);/// 执行 fMethod(fIndexStart,fIndexStop)procedure Process; override;publicend;/// 允许在线程池中并行执行基于索引的过程// - 将创建自己的线程池,然后将工作分配给每个线程执行TSynParallelProcess = class(TSynPersistentLock)protectedfThreadName: RawUtf8; // 线程名称fPool: array of TSynParallelProcessThread; // 线程池fThreadPoolCount: integer; // 线程池中的线程数fParallelRunCount: integer; // 并行运行次数public/// 初始化线程池// - 您可以定义一些回调来嵌套线程执行,例如,分配给 TRestServer.BeginCurrentThread/EndCurrentThread// - 最多可设置 MaxThreadPoolCount=32 个线程(您可以允许更大的值,但此线程池的目的是使其进程饱和每个 CPU 核心)// - 如果 ThreadPoolCount 为 0,则不会创建线程,并且过程将在当前线程中执行constructor Create(ThreadPoolCount: integer; const ThreadName: RawUtf8;const OnBeforeExecute: TOnNotifyThread = nil; // 执行前通知回调const OnAfterExecute: TOnNotifyThread = nil;  // 执行后通知回调MaxThreadPoolCount: integer = 32); reintroduce; virtual;/// 终结线程池destructor Destroy; override;/// 并行运行一个方法,并等待执行完成// - 将 Method[0..MethodCount-1] 的执行分散到线程中// - 如果在过程中发生任何异常,则此方法将引发 ESynParallel 异常// - 如果设置了 OnMainThreadIdle,则当前线程(例如,预期为主 UI 线程)将不会处理任何内容,但在等待后台线程时调用此事件procedure ParallelRunAndWait(const Method: TOnSynParallelProcess;MethodCount: integer; const OnMainThreadIdle: TNotifyEvent = nil);published/// 已激活的线程数property ParallelRunCount: integerread fParallelRunCount;/// 此实例线程池中当前有多少线程property ThreadPoolCount: integerread fThreadPoolCount;/// 一些文本标识符,用于区分每个拥有的线程property ThreadName: RawUtf8read fThreadName;end;

后期再整理!

由于 TSynParallelProcess在mORMot 2框架中是一个假定的类(因为标准的mORMot 2库并不直接包含这个类名,但它可能是一个自定义扩展或类似功能的类的代表),我将基于您提供的类定义来编写一个假设的例程代码,这个代码将模拟在Free Pascal中使用这样一个类。

请注意,以下代码将不会直接编译,因为 TSynParallelProcessTSynParallelProcessThread的具体实现细节(如构造函数、析构函数和方法的内部逻辑)并未给出。但是,我将提供一个结构化的示例,展示如何使用这样的类(如果它存在的话)。

program TSynParallelProcessDemo;{$MODE DELPHI}usesSysUtils, Classes; // 引入必要的单元// 假设TSynParallelProcess和TSynParallelProcessThread已经在某个单元中定义
// 这里我们使用一个占位符单元名YourMormotUnit
// 注意:在实际应用中,您需要替换'YourMormotUnit'为包含这些类的实际单元名
uses YourMormotUnit;procedure MyParallelTask(IndexStart, IndexStop: integer);
begin// 这里是您的并行任务逻辑WriteLn('Executing task with indices from ', IndexStart, ' to ', IndexStop);// 模拟耗时操作Sleep(100); // 假设每个任务需要一些时间来完成
end;varParallelProcessor: TSynParallelProcess;TaskCount: Integer;begintry// 初始化任务计数(这里假设我们有100个任务要并行处理)// 注意:在实际应用中,您可能需要根据具体情况来确定这个值TaskCount := 100;// 创建TSynParallelProcess实例// 注意:这里我们假设ThreadPoolCount是一个合理的值,例如CPU核心数的两倍// 并且MaxThreadPoolCount足够大以容纳所需的线程数// ThreadName是可选的,用于标识线程池中的线程ParallelProcessor := TSynParallelProcess.Create(System.SysUtils.GetProcessorCount * 2, // 假设线程池大小为CPU核心数的两倍'MyParallelTasks', // 线程名称前缀(可选)nil, // OnBeforeExecute回调(这里不使用)nil  // OnAfterExecute回调(这里不使用));try// 并行运行任务并等待完成// 注意:这里的ParallelRunAndWait是假设的方法,它可能不直接存在于TSynParallelProcess中// 您需要根据实际的方法签名和逻辑来调整以下调用// 由于我们没有ParallelRunAndWait的具体实现,这里只是一个示意性的调用// 在实际中,您可能需要调用一个不同的方法,或者ParallelRunAndWait本身就需要您来实现// 假设ParallelRunAndWait接受一个任务过程和任务总数作为参数ParallelProcessor.ParallelRunAndWait(@MyParallelTask, // 指向您的并行任务过程的指针TaskCount        // 要并行处理的任务总数);finally// 销毁TSynParallelProcess实例ParallelProcessor.Free;end;excepton E: Exception doWriteLn('An error occurred: ', E.Message);end;// 保持控制台窗口打开,直到用户按任意键WriteLn('Press Enter to exit...');ReadLn;
end.

重要说明

  1. 类和方法的存在性:上述代码假设 TSynParallelProcess类及其 ParallelRunAndWait方法存在。在mORMot 2的标准库中,这样的类和方法可能不存在,或者它们的名称和参数可能有所不同。
  2. 实现细节:由于我们没有 TSynParallelProcessTSynParallelProcessThread的具体实现,因此上述代码中的 ParallelRunAndWait调用是示意性的。在实际应用中,您需要根据实际可用的方法来实现并行任务的执行。
  3. 线程池大小:在创建 TSynParallelProcess实例时,我使用了 System.SysUtils.GetProcessorCount * 2作为线程池的大小。这只是一个常见的启发式方法,用于确定合理的线程数。然而,最佳线程数取决于您的具体应用程序和工作负载。
  4. 错误处理:代码中包含了基本的错误处理逻辑,用于捕获并打印异常消息。在实际应用中,您可能需要根据需要扩展这种错误处理。
  5. 单元引用:请将 uses YourMormotUnit;中的 YourMormotUnit替换为包含 TSynParallelProcessTSynParallelProcessThread定义的实际单元名。如果这些类是您自定义的,那么您需要确保它们已经被正确编译并包含在您的项目中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/740854.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pandas我这个填充nan值为什么填充不上呢?

大家好,我是Python进阶者。 一、前言 前几天在Python钻石交流群【逆光】问了一个Python数据处理的问题,问题如下:请问一下,我这个填充nan值为什么填充不上呢二、实现过程 这里【瑜亮老师】给了个思路如下:试试看这样,代码如下: sf_mergetotal.loc[sf_mergetotal[寄件人]…

python matplot绘图工具练习

matplot 数据可视化 seaborn# pyplot import matplotlib.pyplot as plt import numpy as np import seaborn as sns import pandas as pdx_point = np.array([0,6]) y_point = np.array([0,100]) plt.plot(x_point,y_point,b-.v) # 格式处理 plt.show()x = np.arange(0,4…

R语言用逻辑回归、决策树和随机森林对信贷数据集进行分类预测|附代码数据

原文链接:http://tecdat.cn/?p=17950 最近我们被客户要求撰写关于的研究报告,包括一些图形和统计输出。在本文中,我们使用了逻辑回归、决策树和随机森林模型来对信用数据集进行分类预测并比较了它们的性能数据集是 credit=read.csv("gecredit.csv", header = T…

代码随想录算法训练营第27天 | 122.买卖股票的最佳时机 II 55. 跳跃游戏 1005.K次取反后最大化的数组和

122.买卖股票的最佳时机 II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得的 最大 利润 。 解题: 思路:最…

R语言实现 Copula 算法建模相依性案例分析报告

原文链接:http://tecdat.cn/?p=6193 原文出处:拓端数据部落公众号copula是将多变量分布函数与其边缘分布函数耦合的函数,通常称为边缘。Copula是建模和模拟相关随机变量的绝佳工具。Copula的主要吸引力在于,通过使用它们,你可以分别对相关结构和边缘(即每个随机变量的分…

【视频讲解】Python、R时间卷积神经网络TCN与CNN、RNN预测时间序列3实例附代码数据

全文链接:https://tecdat.cn/?p=36944 原文出处:拓端数据部落公众号 本文旨在探讨时间卷积网络(Temporal Convolutional Network, TCN)与CNN、RNN在预测任务中的应用。通过引入TCN模型,我们尝试解决时间序列数据中的复杂依赖关系,以提高预测的准确性。本文首先介绍了TCN…

反转链表

目录L206 反转链表题目描述题解方法一:迭代方法二:递归L92 反转链表 II题目描述题解方法一:一遍扫描方法二:穿针引线L25 K个一组反转链表题目描述题解方法一:模拟 L206 反转链表 题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例1:示例2:题…

springboot 进程已结束,退出代码为 0

原文:https://blog.csdn.net/lvoelife/article/details/134129860 在pom.xml中,添加<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>然后用maven,重新加载项目…

G64【模板】线性基 贪心法 P3812 最大异或和

视频链接: P3812 【模板】线性基 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)// 线性基 O(63*n) #include <iostream> #include <cstring> #include <algorithm> using namespace std;typedef long long LL; int n; LL p[64];void insert(LL x){ //贪…

相机的标定

Camera-calibration 用于矫正相机的畸变代码部分 #打开摄像头,将读取的视频保存在本地,名字叫output.avi# coding=utf-8 import cv2 as cv cap = cv.VideoCapture(0) # 检查是否成功打开摄像头 if not cap.isOpened():print("Cannot open camera")exit() # 获取摄像…

关于golang函数传参问题

今天在写leetcode的一个简单问题的时候发现golang的切片传递并不是直接 传递地址的,而是一个地址副本。如图所示,当我利用test函数对nums1和nums2数组处理时,并不是对原来的nums1和nums2做处理,而是对他们的副本nums1_temp和nums2_temp做处理,但是nums1_temp和nums1都指向…

PN转Modbus RTU模块连接ACS4QQ变频器通信

巴图自动化PN转Modbus RTU模块(BT-MDPN10)的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。PN转Modbus RTU模块集成了Modbus和Profinet两种协议,支持Modbus RTU主从站,可连接变频器、智能高低压电器、功率测量设备等RS485/232接口设备。一台完整的机器在出厂前由…