gpt4 book ai didi

c# - 最好使用多线程? (线程池或线程)

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:36 24 4
gpt4 key购买 nike

希望这是一个比我之前的问题更好的问题。我有一个 .exe,我将向其传递不同的参数(文件路径),然后它将接受并解析。所以我将有一个循环,遍历列表中的文件路径并将它们传递给这个 .exe 文件。

为了提高效率,我想将执行分散到多个内核上,我认为您可以通过线程来完成。

我的问题是,我应该使用线程池还是多个线程来异步运行此 .exe?

另外,根据你们认为哪一个是最好的,如果你能给我指一个教程,里面有一些关于我想做什么的信息。谢谢!

编辑:我需要将 .exe 的执行次数限制为每个核心执行一次。这是最有效的,因为如果我要解析 100,000 个文件,我不能只启动 100,000 个进程。因此,我使用线程将一次执行的次数限制为每个核心一次执行。如果有另一种方法(线程除外)可以查明处理器是否未被执行,或者 .exe 是否已完成,请解释。但如果没有其他方法,我的最终问题是如何使用线程调用解析方法,然后在该线程不再使用时回调?

第二次更新(非常重要):

我仔细研究了每个人告诉我的内容,发现了一个我遗漏但我认为无关紧要的关键要素。所以我正在使用 GUI,我不希望它被锁定。这就是为什么我想使用线程。我现在的主要问题是,如何从线程发回信息以便知道执行何时结束?

最佳答案

正如我在回答您之前的问题时所说,我认为您不了解进程和线程之间的区别。过程非常“繁重”(*);每个进程可以包含多个线程。如果您从父进程生成新进程,则该父进程不需要创建新线程;每个进程都有自己的线程集合。

如果所有工作都在同一个进程中完成,则只在父进程中创建线程。

将线程想象成一个 worker ,将一个进程想象成一个包含一个或多个 worker 的建筑物。

一种策略是“ build 一座建筑物,并在其中安置十名 worker ,每人做一些工作”。您得到构建一个进程和十个线程的费用。

如果您的策略是“ build 一座建筑物。然后让该建筑物中的一名 worker 下令 build 一千多座建筑物,每座建筑物都包含一名执行其投标的 worker ”,那么您将获得 build 1001 座建筑物的费用并雇用 1001 名 worker 。

不想追求的策略是“ build 一座建筑物。在该建筑物中雇用 1000 名 worker 。然后指示每个 worker build 一座建筑物,然后让一名 worker 去做真正的工作工作。”创建一个线程的唯一工作是创建一个进程,然后创建一个线程是没有意义的!你有 1001 栋建筑和 2001 名 worker ,其中一半立即闲置但仍需支付工资。

看你的具体问题:关键问题是“瓶颈在哪里?”产生新进程或新线程只有在性能问题是处理器上的性能问题时才有帮助。如果解析器的性能不是取决于解析文件的速度,而是取决于从磁盘中取出文件的速度,那么并行化它会使事情变得更糟。您将拥有大量的系统资源,用于同时对同一个磁盘 Controller 进行所有锤击,并且磁盘 Controller 会随着负载的增加而变慢。

更新:

I need to limit the number of executions of the .exe to ONE execution PER CORE. This is the most efficient because if I am parsing 100,000 files I can't just fire up 100000 processes. So I am using threads to limit the number of executions at one time to one execution per core. If there is another way (other than threads) to find out if a processor isn't tied up in execution, or if the .exe has finished please explain

这似乎是一种非常复杂的方法。假设您有 n 个处理器。据我了解,您提出的策略是启动 n 个线程,然后让每个线程启动一个进程,并且您知道由于操作系统可能为每个 CPU 调度一个线程,因此 不知何故 处理器也会神奇地在不同的 CPU 上安排每个新进程中的新线程

这似乎是一个曲折的推理链,取决于操作系统的实现细节。这太疯狂了。 如果你想设置特定进程的处理器关联,只需set the processor affinity on the process ! 不要用线程做这种疯狂的事情并希望它能成功。

我说的是,如果您希望运行的可执行文件的实例不超过 n 个,每个处理器一个,则根本不要乱用线程。相反,只让一个线程处于循环中,constantly monitoring what processes are running .如果运行的可执行文件的副本少于 n 个,则生成另一个副本并将其处理器亲和性设置为您最喜欢的 CPU。如果有 n 个或更多的可执行文件副本正在运行,请休眠一秒钟(或一分钟,或任何有意义的时间),当您醒来时,再次检查。继续这样做,直到你完成。这似乎是一种更简单的方法。


(*) 线程也很重,但比进程轻。

关于c# - 最好使用多线程? (线程池或线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6630560/

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