gpt4 book ai didi

mysql - fork 还是不 fork ?

转载 作者:可可西里 更新时间:2023-11-01 06:39:46 27 4
gpt4 key购买 nike

我正在重新开发一个系统,该系统将通过 http 向多个供应商之一发送消息。原来是perl脚本,重新开发很可能也会用perl。

在旧系统中,同时运行多个 perl 脚本,每个供应商运行 5 个。当一条消息被放入数据库时​​,随机线程号 (1-5) 和供应商被选择以确保没有消息被处理两次,同时避免必须锁定表/行。此外,数据库中还有一个“公平队列位置”字段,以确保发送大消息时不会延迟发送大消息时发生的小消息发送。

有时每分钟只有几条消息,但有时可能会转储数十万条消息。在我看来,让所有脚本一直运行并检查消息是一种资源浪费,所以我正在尝试找出是否有更好的方法来做到这一点,或者旧方法是否可以接受。

我现在的想法是让一个脚本运行并根据需要(最多限制) fork 尽可能多的子进程,具体取决于有多少流量,但我不确定如何最好地实现它这样每条消息只处理一次,同时保持公平排队。

我现在最好的猜测是父脚本更新数据库以指示哪个子进程应该处理它,但是我担心这最终会比原始方法效率低。我没有编写 fork 代码的经验(我上一次写是大约 15 年前)。

任何有关如何最好地处理消息队列的想法或指向指南的链接都将受到赞赏!

最佳答案

您可以使用 Thread::Queue 或任何其他的:Is there a multiprocessing module for Perl?

如果旧系统是以这种方式用 Perl 编写的,您可以重用它的大部分内容。

无效示例:

use strict;
use warnings;

use threads;
use Thread::Queue;

my $q = Thread::Queue->new(); # A new empty queue

# Worker thread
my @thrs = threads->create(sub {
while (my $item = $q->dequeue()) {
# Do work on $item
}
})->detach() for 1..10;#for 10 threads
my $dbh = ...
while (1){
#get items from db
my @items = get_items_from_db($dbh);
# Send work to the thread
$q->enqueue(@items);
print "Pending items: "$q->pending()."\n";
sleep 15;#check DB in every 15 secs
}

关于mysql - fork 还是不 fork ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13162235/

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