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,每一种都有稍微不同的性能特征,但同样,通常最好让框架为您处理