首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步编程与异步编程

同步编程与异步编程
EN

Stack Overflow用户
提问于 2009-05-07 03:29:44
回答 4查看 2.4K关注 0票数 0

在设计服务器时,我们正在考虑两种方法:

  1. 一种异步(基于选择的)方法,这样后端rpc可以在单个线程中并行化。
  2. 一种同步方法,在线程池的另一个线程中处理每个后端rpc。

有一些权衡:1具有更好的性能,2有较少的代码复杂度。现在机器运行多核和64位,1真的很重要吗?

EN

回答 4

Stack Overflow用户

发布于 2009-05-07 03:51:42

我建议读这些关于ACE的书。

  • C++网络编程:利用ACE和模式掌握复杂性
  • C++网络编程:基于ACE和框架的系统重用

获取模式的想法,允许您创建一个高效的服务器。

票数 2
EN

Stack Overflow用户

发布于 2009-05-07 03:37:34

我认为应该相反,异步select()方法使代码更简单,因为不涉及线程同步。

您只需将套接字句柄的列表传递到select()函数中即可。它只在一个或多个套接字句柄发生事情时才会阻塞和返回。与使用线程池相反,在线程池中,必须有一个作业分派队列,线程池中的所有线程都从该队列中抓取作业。

异步select()方法的缺点是它不会随着处理器核心的数量而扩展,因为所有的东西都是在一个线程中执行的。

票数 0
EN

Stack Overflow用户

发布于 2009-05-07 04:30:03

如果不了解服务器需求的更多细节,就很难判断哪种方法可以提供更好的性能和/或降低代码复杂性。

有趣的是,在实际的服务器设计中,性能和简单通常是并行不悖的(但简单的设计是很难的)。选择/轮询本身不会自动提供更好的性能。线程池绝对不会降低您的代码复杂性。

回答你的问题:1仍然重要。异步设计不能很好地扩展多进程机器,但只有在服务器在一个进程上运行时才是正确的。如果您的服务器被设计为在多进程计算机上生成多个进程怎么办?不同的进程可以在不同的用户帐户下运行,并且具有不同的安全设置。虚拟机怎么样?每个进程一个线程并不意味着您不能利用多核机器。

但是,我真的不记得上次看到基于异步select()的真正的服务器设计是什么时候了。也许在我上大学的时候,在教科书里,但是没有任何真正的生产系统。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/832774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档