Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 线程还是异步?_Multithreading_Language Agnostic - Fatal编程技术网

Multithreading 线程还是异步?

Multithreading 线程还是异步?,multithreading,language-agnostic,Multithreading,Language Agnostic,如何使应用程序具有多线程? 你使用异步函数吗? 或者你会产生一个新的线程? 我认为异步函数已经在生成一个线程,所以如果你的工作只是读取一些文件,那么懒惰并且只是在一个线程上生成你的工作只会“浪费”资源。。。 那么,在使用线程或异步函数时,是否有某种设计呢?如果您谈论的是.Net,那么请不要忘记。线程池也是异步函数经常使用的。产生大量线程实际上会影响性能。线程池的设计目的是产生足够的线程,以最快的速度完成工作。因此,除非线程池不能满足您的需要,否则一定要使用线程池,而不是spwang您自己的线程

如何使应用程序具有多线程? 你使用异步函数吗? 或者你会产生一个新的线程? 我认为异步函数已经在生成一个线程,所以如果你的工作只是读取一些文件,那么懒惰并且只是在一个线程上生成你的工作只会“浪费”资源。。。
那么,在使用线程或异步函数时,是否有某种设计呢?

如果您谈论的是.Net,那么请不要忘记。线程池也是异步函数经常使用的。产生大量线程实际上会影响性能。线程池的设计目的是产生足够的线程,以最快的速度完成工作。因此,除非线程池不能满足您的需要,否则一定要使用线程池,而不是spwang您自己的线程


注:请注意Microsoft提供的信息。线程的使用可以让您更多地考虑应用程序需要线程的方式,并且从长远来看可以更容易地提高/控制性能。
异步方法使用起来更快,但它们有点神奇——许多事情恰好使它们成为可能——因此,在某个时候,您可能需要一些它们无法提供给您的东西。然后您可以尝试滚动一些自定义线程代码。

这完全取决于您的需要。

如果您开始生成大量线程,那么生成线程只会浪费资源,一个或两个额外的线程不会影响平台的性能,事实上,系统目前为我提供了70多个线程,msn使用32个线程(我真的不知道一个messenger怎么能使用这么多线程,特别是当它最小化并且不真正做任何事情时…)

通常,当某些事情需要很长时间,但您需要继续做其他事情时,就可以生成线程

比如说计算需要30秒。最好的办法是为计算生成一个新线程,这样你就可以继续更新屏幕,处理任何用户输入,因为如果你的应用程序冻结到完成计算,用户会讨厌它

另一方面,创建线程来完成几乎可以立即完成的任务几乎是毫无意义的,因为创建(甚至只是使用线程池将工作传递给现有线程)的开销将高于一开始就完成的任务

有时,你可以将你的应用分成几个独立的部分,这些部分在各自的线程中运行。例如,在游戏中,更新/物理等可能是一个线程,而grahpics是另一个线程,声音/音乐是第三个线程,而网络是另一个线程。这里的问题是,你真的必须考虑这些部分将如何交互,否则你可能会遇到更糟的情况从形式上看,错误似乎是“随机”发生的,甚至可能会死锁。

我再回答一个问题-创建自己的线程是处理大型任务或处理可能会“阻塞”的任务的一个极好方法对于synchronous app的其余部分,但是您必须清楚地了解您必须解决的问题,并以一种明确定义线程任务并限制其作用范围的方式进行开发

例如,我最近研究的一个例子——Java控制台应用程序定期运行,通过屏幕抓取URL、使用DOM解析文档、提取数据并将其存储在数据库中来捕获数据

作为一个单线程应用程序,正如您所料,它需要一段时间,一个50kb的页面平均每秒1个url。还不错,但当您扩展到需要成批处理数千个url时,这是不好的

对应用程序进行分析表明,大多数时候活动线程处于空闲状态—它在等待I/O操作—打开远程URL的套接字,打开与数据库的连接等。正是这种情况可以通过多线程轻松改善。重写为多线程,只需5个线程而不是1个线程,eve在单核cpu上,吞吐量增加了20倍以上

在这个例子中,每个“工作者”线程都被明确地限制在它所做的事情上——打开远程url,解析数据,将其存储在数据库中。所有的“高级”处理——生成要解析的url列表,确定下一步是哪个,处理错误,都由主线程控制。

答案是“这取决于”

这取决于你想要达到的目标。我假设你的目标是提高绩效

最简单的解决方案是找到另一种提高性能的方法。运行探查器。查找热点。减少不必要的IO

下一个解决方案是将您的程序分成多个进程,每个进程都可以在自己的地址空间中运行。这是最简单的,因为单个进程不可能相互混淆

下一个解决方案是使用线程。此时,您正在打开一个主要的蠕虫程序,所以从小的开始,并且只使用多线程作为代码的关键路径

下一个解决方案是使用AssiiCo。通常只推荐给编写非常重负载的服务器的人,甚至我也会重用现有的一个框架来抽象细节,例如C++框架ICE,或者java下的EJB服务器。 请注意,这些解决方案中的每一个都有多个子解决方案——有不同种类的线程和不同种类的异步IO,每一种都有稍微不同的性能特征,但同样,通常最好让框架为您处理