处理同一应用程序的许多线程的有效方法

时间:2018-04-27 05:31:31

标签: multithreading performance sockets

我有一个多客户端单服务器应用程序,其中客户端和服务器通过套接字连接。客户端和服务器位于不同的机器中。

在客户端应用程序中,客户端套接字连接到服务器并定期向服务器发送数据。

在服务器应用程序服务器套接字中侦听客户端连接。连接客户端时,会为客户端创建新线程以接收数据。

例如:1 client = 1由服务器创建的用于接收数据的线程。如果是10000客户端,则服务器创建10000个线程。这似乎也不好并且可扩展。

我的应用程序是Java。

这个问题有替代方法吗?

提前致谢

4 个答案:

答案 0 :(得分:1)

这是典型的C10K问题。有一些模式可以解决这个问题,一个例子是Reactor pattern

Java NIO是另一种可以非阻塞方式处理传入请求的方法。请参阅参考实现here

答案 1 :(得分:0)

是的,您不需要为每个客户端提供单独的线程。有一个很好的教程here解释了如何使用await来处理异步套接字通信。通过套接字接收数据后,您可以使用固定数量的线程。本教程还介绍了处理数千个同步通信的技术。

不幸的是,鉴于复杂性,我们无法在此处发布代码,因此尽管仅链接答案不受欢迎......

答案 2 :(得分:0)

我认为它是Erlang / Elixir应用程序的完美候选者。 Whatsapp,RabbitMQ ......

Erlang进程起步便宜且快速,Erlang为您管理调度,因此您不必考虑线程,CPU甚至机器的数量,Erlang在您完成后为每个进程管理垃圾收集&# 39;不再需要了。

Haskell很慢,Erlang对于大多数没有进行繁重计算的应用程序而言足够快,即使这样你也可以使用它并将繁重的工作交给C进程。

你正在写什么?

答案 3 :(得分:-1)

是的,您可以使用Actor模型,例如: Akka或Akka.net。这允许您创建数百万个运行于例如4个主题。 Erlang是一种本地实现actor模型的编程语言。

但是,如果您依赖于对依赖的后端服务的阻塞库调用,例如(JVM世界中最突出的示例)JDBC调用,则actor和非阻塞代码对您没有多大帮助。

Haskell使用了一种相当有趣的方法,称为绿色线程。这意味着运行时线程非常轻量级并且动态映射到OS线程。这也意味着您可以免费获得一定的可扩展性,并且无需编写非阻塞IO代码。但是,它确实需要运行时良好的IO管理器来有效地调度IO操作,并且近年来GHC Haskell已经投入了大量的工作。