gpt4 book ai didi

c# - 我怎样才能连续 QueueUserWorkItems 而不是一次排队?

转载 作者:行者123 更新时间:2023-11-30 17:24:09 27 4
gpt4 key购买 nike

我正在为网站开发多线程抓取工具,根据另一个问题,我决定将 ThreadPool 与 QueueUserWorkItem() 一起使用。

如何连续对工作项进行排队,而不是一次将它们全部排队?我需要排队 > 300k 项目(每个用户 ID 一个),如果我循环将它们全部排队,我将耗尽内存。

所以,我想要的是:

// 1 = startUserID, 300000 = endUserID, 25 = MaxThreads  
Scraper webScraper = new Scraper(1, 300000, 25);

webScraper.Start();
// return immediately while webScraper runs in the background

在此期间,当线程可用时,webScraper 不断添加所有 300000 个工作项。

这是我目前所拥有的:

public class Scraper
{
private int MaxUserID { get; set; }
private int MaxThreads { get; set; }
private static int CurrentUserID { get; set; }
private bool Running { get; set; }
private Parser StatsParser = new Parser();


public Scraper()
: this(0, Int32.MaxValue, 25)
{
}

public Scraper(int CurrentUserID, int MaxUserID, int MaxThreads)
{
this.CurrentUserID = CurrentUserID;
this.MaxUserID = MaxUserID;
this.MaxThreads = MaxThreads;
this.Running = false;

ThreadPool.SetMaxThreads(MaxThreads, MaxThreads);
}

public void Start()
{
int availableThreads;

// Need to start a new thread to spawn the new WorkItems so Start() will return right away?
while (Running)
{

// if (!CurrentUserID >= MaxUserID)
// {
// while (availableThreads > 0)
// {
// ThreadPool.QueueUserWorkItem(new WaitCallBack(Process));
// }
// }
// else
// { Running = false; }
}
}

public void Stop()
{
Running = false;
}

public static void process(object state)
{
var userID = Interlocked.Increment(ref CurrentUserID);
... Fetch Stats for userID
}
}

这是正确的方法吗?

任何人都可以指出正确的方向,以便在调用 Start() 后在后台处理我的工作项的创建,而不是一次创建所有工作项吗?

最佳答案

如果减少从工作队列中窃取工作的工作项,是否会更好地实现这一点?仅仅因为你有 300,000 件工作要做,并不意味着你需要 300,000 个 worker 来做。显然,由于您只有几个核心,因此只有少数这些工作可以并行进行,那么为什么不将大块工作分配给更少的工作人员呢?

根据每件工作所花费的时间有多稳定,您可以将其平均分配给每个工作人员,或者有一个中央队列(您必须锁定它)并且每个工作人员都可以抓取一些工作作为它用完了。

编辑:

Joe Duffy 似乎有一系列关于在这里编写工作窃取队列的文章:http://www.bluebytesoftware.com/blog/2008/08/12/BuildingACustomThreadPoolSeriesPart2AWorkStealingQueue.aspx .看起来 .Net 4 的 Threadpool 会更智能一些。但我认为对于这种情况您不需要特别复杂的东西。

关于c# - 我怎样才能连续 QueueUserWorkItems 而不是一次排队?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1403974/

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