gpt4 book ai didi

multithreading - 只是为阻塞操作启动新线程是不好的做法(Perl)

转载 作者:行者123 更新时间:2023-12-04 01:42:31 24 4
gpt4 key购买 nike

如果执行 CPU 密集型任务,我认为每个核心有一个线程是最佳的。如果您有一个 4 核 CPU,您可以运行 4 个 CPU 密集型子程序的实例而不会受到任何惩罚。例如,我曾经在一个四核 CPU 上实验性地运行了四个 CPU 密集型算法实例。每个过程最多四倍的时间没有减少。在第五个实例中,所有实例都花费了更长的时间。

阻塞操作是什么情况?假设我有一个包含 1,000 个 URL 的列表。我一直在做以下事情:

(请不要介意任何语法错误,我只是对此进行了模拟)

my @threads;
foreach my $url (@urlList) {
push @threads, async {
my $response = $ua->get($url);
return $response->content;
}
}

foreach my $thread (@threads) {
my $response = $thread->join;
do_stuff($response);
}

我基本上启动了与 URL 列表中的 URL 一样多的线程。如果有一百万个 URL,那么一百万个线程将被启动。这是最佳的,如果不是最佳的线程数是多少?对于任何可以等待的阻塞 I/O 操作(读取文件、数据库查询等),使用线程是否是一个好习惯?

相关奖励问题

出于好奇,Perl 线程的工作方式与 Python 相同吗?它是 GIL 吗?使用 python 来获得多线程的好处并利用所有内核执行 CPU 密集型任务,您必须使用多处理。

最佳答案

Out of curiosity does Perl threads work the same as Python and it's GIL? With python to get the benefit of multithreading and utilize all cores for CPU intensive tasks you have to use multiprocessing.



不,但结论是一样的。 Perl 没有跨线程保护解释器的大锁;相反,它为每个不同的线程都有一个重复的解释器。由于变量属于解释器(并且只有一个解释器),因此默认情况下线程之间不共享数据。当变量被显式共享时,它们被放置在一个共享解释器中,该解释器代表其他线程序列化对共享变量的所有访问。除了这里其他人提到的内存问题之外,Perl 中的线程还存在一些严重的性能问题,以及对可以共享的数据类型以及您可以用它做什么的限制(更多信息请参见 perlthrtut信息)。

结果是,如果您需要并行化大量 IO 并且可以使其非阻塞,那么您将从事件循环模型中获得比线程更高的性能。如果你需要并行化那些不能成为非阻塞的东西,你可能会比使用 perl 线程更幸运地使用多进程(并且一旦你熟悉了那种代码,它也更容易调试)。

也可以组合这两个模型(例如,一个主要是单进程的事件应用程序,它使用 POE::Wheel::RunAnyEvent::Run 将某些昂贵的工作传递给子进程,或者一个多进程应用程序,它有一个事件父管理非事件子节点,或节点集群类型设置,其中您有许多预 fork 的事件网络服务器,父节点只有 accept s 并将 FD 传递给其子节点)。

不过,目前还没有 Elixir ,至少现在还没有。

关于multithreading - 只是为阻塞操作启动新线程是不好的做法(Perl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17276719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com