具有大量线程的多线程处理

2024-04-28 11:11:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在模拟一个有大量节点的网状网络。节点在整个网络中的不同主节点之间传递数据。在

每个主节点每秒都会实时接收一次信息,但是从节点不知道主节点何时启动或不启动,所以当它们有信息要发送时,它们会尝试每隔5毫秒发送一次,持续1秒,以确保能够找到主节点。在

在一台有1600个节点的普通计算机上运行它会导致1600个线程,并且性能非常差。在

什么是处理线程的好方法,使每个节点都像在自己的线程上运行一样工作?在

万一有关系,我正在用Python2.7构建模拟,但如果有意义的话,我愿意换成其他的东西。在


Tags: 方法网络信息节点关系计算机性能线程
3条回答

首先,您是否真的使用了默认Python 2.7解释器(CPython)中提供的常规、默认的Python线程,并且所有代码都是用Python编写的吗?如果是这样,您可能实际上没有使用多个CPU内核,因为CPython拥有全局解释器锁(请参见https://wiki.python.org/moin/GlobalInterpreterLock)。您可以尝试在Jython下运行代码,以检查性能是否会更好。在

您可能应该重新考虑您的应用程序体系结构,切换到手动调度事件而不是使用线程,或者尝试使用greenlets(https://stackoverflow.com/a/15596277/1488821)之类的东西,但这可能意味着由于缺乏并行性而导致的计时不太精确。在

对我来说,1600个线程听起来是很多,但考虑到这是一个模拟,并不过分。如果这是一个生产应用程序,它可能不值得生产。在

一台标准机器在处理1600个螺纹时应该不会有问题。至于操作系统this article可以为您提供一些见解。在

当涉及到代码时,Python脚本不是本机应用程序,而是一个解释脚本,因此需要更多的CPU资源来执行。在

<>我建议您尝试在C或C++中实现模拟,而不是生成一个本地应用程序,它应该更有效地执行。在

不要使用线程。如果坚持使用Python,让节点逐个执行它们的操作。如果你的性能是可以的,你就不必使用C/C++。如果每个节点执行的操作都很简单,那就可以了。无论如何,根本没有理由在Python中使用线程。Python线程主要用于使阻塞的I/O不阻塞您的程序,而不是用于多个CPU内核的利用。在

如果您想真正使用并行处理并编写节点,就好像它们实际上是分开的,并且只使用消息交换,那么可以使用Erlang(http://www.erlang.org/)。它是一种非常适合于执行并行进程并使它们交换消息的函数式语言。Erlang进程不映射到OS线程,您可能会创建数千个线程。然而,Erlang是一种纯函数式语言,如果您从未使用过这种语言,那么它可能会显得非常奇怪。而且它也不是很快,因此,像Python一样,它不可能每5毫秒处理1600个操作,除非这些操作非常简单。在

最后,如果您没有使用Python或Erlang获得期望的性能,您可以移动到C或C++。但是,仍然不要使用1600个螺纹。事实上,只有当线程的数量没有显著超过CPU内核的数量时,使用线程来获得性能才是合理的。在这种情况下(http://en.wikipedia.org/wiki/Reactor_pattern)可能需要reactor模式(带有多个reactor线程)。在中有一个很好的reactor模式的实现boost.asio公司图书馆。解释如下:http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio/

相关问题 更多 >