Joe*_*Gfd 2 c# multithreading multicore
希望这是一个比我以前更好的问题.我有一个.exe,我将传递不同的参数(文件路径),然后它将接收和解析.所以我将循环,循环遍历列表中的文件路径并将它们传递给此.exe文件.
为了提高效率,我希望将执行分散到多个核心,我认为您通过线程进行了这一操作.
我的问题是,我应该使用线程池,还是多个线程来异步运行这个.exe?
另外,根据你们认为哪一个是最好的,如果你能指出一个教程,它将有一些关于我想做什么的信息.谢谢!
编辑:我需要将.exe的执行次数限制为一次执行PER CORE.这是最有效的,因为如果我解析100,000个文件,我不能只启动100000个进程.所以我使用线程将一次执行的次数限制为每个核心执行一次.如果有其他方法(线程除外)找出处理器是否没有执行,或者.exe已经完成请解释.但是如果没有其他方法,我的最终问题是如何使用线程调用解析方法然后在该线程不再使用时回调?
第二次更新(非常重要):
我经历了每个人都告诉我的事情,并找到了我遗漏的一个关键因素,我认为这无关紧要.所以我使用的是GUI,我不希望它被锁定.这就是我想使用线程的原因.我现在的主要问题是,如何从线程发回信息,以便我知道执行何时结束?
Eri*_*ert 11
正如我在回答您之前的问题时所说,我认为您不理解进程和线程之间的区别.流程非常"沉重"(*); 每个进程可以包含许多线程.如果从父进程生成新进程,则该父进程不需要创建新线程; 每个进程都有自己的线程集合.
如果在同一进程中完成所有工作,则仅在父进程中创建线程.
将线程视为工作者,将流程视为包含一个或多个工作者的构建.
一个策略是"建造一个单独的建筑物并用十个工人填充它们,每个工人做一些工作".您将获得构建一个进程和十个线程的费用.
如果你的策略是"建造一座建筑物.然后让那个建筑物中的一个工人命令建造另外一千多个建筑物,每个建筑物都包含一个招标的工人",那么你将获得建造1001栋建筑物和雇用1001的费用.工作人员.
你的策略并不想追求的是"建楼,聘请1000名工作者在该建筑物.然后指导每个工人建造的建筑物,然后有一个工人去做真正的工作." 制作一个唯一的工作就是创建一个进程然后创建一个线程的线程是没有意义的!你有1001座建筑物和2001年的工人,其中一半人立即闲置但仍需支付.
看看你的具体问题:关键问题是"瓶颈在哪里?" 当性能问题是perf在处理器上被门控时,产生新进程或新线程只会有所帮助.如果你的解析器的性能不是根据你解析文件的速度来决定的,而是取决于你从磁盘上获得它的速度,那么并行化将会使事情变得更加糟糕.你将拥有大量的系统资源用于同时锤击同一个磁盘控制器,并且随着更多的负载堆积,磁盘控制器将变慢.
我需要将.exe的执行次数限制为一次执行PER CORE.这是最有效的,因为如果我解析100,000个文件,我不能只启动100000个进程.所以我使用线程将一次执行的次数限制为每个核心执行一次.如果有其他方法(线程除外)找出处理器是否没有被执行,或者.exe已经完成请解释
这似乎是一个非常复杂的方法.假设您有n个处理器.根据我的理解,您提出的策略是启动n个线程,然后让每个线程启动一个进程,并且您知道,因为操作系统可能会为每个CPU安排一个线程,不知何故处理器将神奇地安排新的在不同的CPU上的每个新进程中的线程?
这似乎是一个曲折的推理链,取决于操作系统的实现细节.这很疯狂.如果要设置特定进程的处理器关联,只需在进程上设置处理器关联!不要用线程做这个疯狂的事情,并希望它成功.
我说如果你想要运行一个可执行文件的n个实例,每个处理器一个,不要乱用线程.相反,只需让一个线程处于循环中,不断监视正在运行的进程.如果正在运行的可执行文件少于n个副本,则生成另一个并将其处理器关联设置为您最喜欢的CPU.如果有正在运行的可执行文件的n个或更多副本,请进入休眠状态一秒钟(或一分钟,或任何有意义的事情),当您醒来时,请再次检查.继续这样做,直到你完成.这似乎是一种更容易的方法.
(*)线程也很重,但它们比进程轻.