在Irssi中使用PERL进行线程处理

时间:2014-07-18 22:25:29

标签: multithreading perl irssi

PERL的线程模块似乎不适用于Irssi。 我无法获得更多相关信息,因为#Irssi的人们从不回应。

我需要让脚本每5分钟检查一次数据库。 现在我认为这可以通过PERL中的多线程实现,但是一旦你包含了模块,Irssi就会抛出异常。

具有讽刺意味的是,如果我尝试构建一个在一段时间后终止自身的while循环,那么Irssi客户端就会挂起。

有什么建议吗?

代码

    use strict;
    use warnings;
    use threads;
    use Thread::Queue;

my $q = Thread::Queue->new();    # A new empty queue
    # Worker thread
    my $thr = threads->create(
        sub {
            # Thread will loop until no more work
            while (defined(my $item = $q->dequeue())) {
                # Do work on $item
            }
        }
    );

Irssi中的错误(不是所有错误,但同样的事情,无法找到包):

13:30| Can't locate package Irssi::ServerSetup for
          @Irssi::Irc::ServerSetup::ISA at
          /home/nullby7e/.irssi/scripts/test.pl line 27.
13:30|
13:30| Can't locate package Irssi::Nick for @Irssi::Irc::Nick::ISA at
          /home/nullby7e/.irssi/scripts/test.pl line 27.
13:30|
13:30| Can't locate package Irssi::ServerConnect for
          @Irssi::Irc::ServerConnect::ISA at
          /home/nullby7e/.irssi/scripts/test.pl line 27.

1 个答案:

答案 0 :(得分:0)

我无法帮助您处理线程,但根据Irssi Perl Scripting Reference,您需要Irssi::timeout_add函数。

您可以在Irssi's Script Repository找到许多如何使用它的示例。基本用法是:

use Irssi;

sub check_database {
    ...
}

Irssi::timeout_add(5*60*1000, "check_database", undef);