gpt4 book ai didi

multithreading - 用于提高性能的线程

转载 作者:行者123 更新时间:2023-12-03 14:59:38 25 4
gpt4 key购买 nike

我从未使用过线程——从未想过我的代码会受益。但是,我认为线程可能会提高以下伪代码的性能:

Loop through table of records containing security symbol field and a quote field
Load a web page (containing a security quote for a symbol) into a string variable
Parse the string for the quote
Save the quote in the table
Get next record
end loop

加载每个网页花费的时间最多。解析引用的速度相当快。我想我可以获取一个线程的一半记录,并在第二个线程中处理另一半记录。

最佳答案

OmniThreadLibrary使用多级管道解决这个问题非常简单 - 第一阶段运行多个任务并下载网页,第二阶段运行在一个实例中并将数据存储到数据库中。我写了一个blog post前段时间记录了这个解决方案。

解决方案可以用以下代码来概括(您必须填写 HttpGet 和 Inserter 方法中的某些位置)。

uses
OtlCommon,
OtlCollections,
OtlParallel;

function HttpGet(url: string; var page: string): boolean;
begin
// retrieve page contents from the url; return False if page is not accessible
end;

procedure Retriever(const input: TOmniValue; var output: TOmniValue);
var
pageContents: string;
begin
if HttpGet(input.AsString, pageContents) then
output := TPage.Create(input.AsString, pageContents);
end;

procedure Inserter(const input, output: IOmniBlockingCollection);
var
page : TOmniValue;
pageObj: TPage;
begin
// connect to database
for page in input do begin
pageObj := TPage(page.AsObject);
// insert pageObj into database
FreeAndNil(pageObj);
end;
// close database connection
end;

procedure ParallelWebRetriever;
var
pipeline: IOmniPipeline;
s : string;
urlList : TStringList;
begin
// set up pipeline
pipeline := Parallel.Pipeline
.Stage(Retriever).NumTasks(Environment.Process.Affinity.Count * 2)
.Stage(Inserter)
.Run;
// insert URLs to be retrieved
for s in urlList do
pipeline.Input.Add(s);
pipeline.Input.CompleteAdding;
// wait for pipeline to complete
pipeline.WaitFor(INFINITE);
end;

关于multithreading - 用于提高性能的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9245874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com