在Perl中编写多线程TCP服务器守护程序是一个坏主意吗?

时间:2009-10-05 12:29:22

标签: perl multithreading daemon

在Perl中编写多线程程序(特别是TCP服务器守护程序)是不是一个坏主意?

7 个答案:

答案 0 :(得分:7)

Perl是服务器的优秀语言。如果你来到解释代码困扰应用程序的任何区域,你可以用C编写扩展代码来处理它。

您还可以查看非阻塞I / O以避免线程开销。 IO :: Lambda是一个很好的模块,它将基于事件的编程简化为一些[匿名]子程序。

答案 1 :(得分:6)

这取决于您使用的Perl版本以及您所使用的操作系统。请参阅Bugs and Limitations中的perldoc threads

答案 2 :(得分:5)

我用POE编写了这样的内容,然后让POE::Wheel::Run根据需要分离出不同的进程。

答案 3 :(得分:4)

继续使用ithreads在Perl中编写服务器。如果它成为复制解释器的负担,那么您的初始实现将作为原型,并且您将能够轻松地将应用程序逻辑转换为C语言。请参阅perldoc perlthrtut

答案 4 :(得分:2)

尽管如此,我不会这样做。您不能预先生成线程,因为您无法将新套接字传递给现有线程。

根据需要创建线程可能非常昂贵,因为每个新线程都会复制所有数据结构。使用一个简单的程序,这没关系,但是如果你先在内存中加载了很多东西,那就太过分了。

因此,当我需要网络服务器时,我在单独的项目中使用了POE和AnyEvent。它们没有线程,但至少你可以用一种理智的方式处理多个连接。它们在Windows和Linux上运行良好,两者都能很好地满足我的需求。

答案 5 :(得分:1)

我不知道我会说这是一个坏主意,但我会说在处理需要多线程的问题域时有更好的选择。

在我看来,更好的选择是C / C ++,但是根据你的技能和你对这些语言的体验,你可能会发现编写它很困难/耗时。我的建议是在Perl中编写它(我假设这是你选择的语言),如果它成为一个问题或者你遇到了性能问题,那么请考虑将代码移到C / C ++之类的东西上。

答案 6 :(得分:1)

是的,这是一个坏主意。这篇文章描述了为什么会这样:Things you need to know before programming Perl ithreads

这里只是上述帖子的摘录:

与世界上存在的大多数其他线程实现不同,包括旧的perl 5.005线程实现,默认情况下,变量不会在Perl ithreads之间共享。那是什么意思呢?这意味着每次启动线程时,所有数据结构都将复制到新线程。当我说全部,我的意思是全部。这例如包括包存储,全局变量,范围内的词汇。一切!一个例子:

use threads ();
my $foo;
threads->new( sub {print "thread: coderef = ".\$foo."\n"} )->join;
print "  main: coderef = ".\$foo."\n";

在我的系统上打印:

thread: coderef = SCALAR(0x1eefb4)
  main: coderef = SCALAR(0x107c90)

但是等等,你可能会说,共享变量可能要好得多。那么为什么我不在我的应用程序中共享所有变量,所以我不会受此影响。嗯,那是错的。为什么?因为共享变量实际上根本不共享。共享变量实际上是普通的绑定变量(包含与绑定变量相关的所有警告和性能问题),它们具有一些“魔力”。因此,共享变量不仅占用与“普通”变量相同的内存量,而且占用额外的内存,因为与之相关的所有绑定魔法。这也意味着你不能拥有与你自己的tie-magic相关联的共享变量(除非你想使用我的Thread :: Tie模块)。