2011-01-27 34 views
0

嘿,我有一个关于perl对象和线程的问题。Perl对象线程

我的程序是处理日志的每一行转换为对象列表,并且 因此,每个对象可以这样引用的日志分析器:获取存储

为值:

print @object[$index]->time; 

output : 01:11:22 

设定值:

@object[$index]->time("01:22:25"); 
print @object[$index]->time; 

output : 01:22:25 

将所有日志保存到内存后,我将列出一个@objects列表。

所以问题在于对象的处理。

我想通过线程处理数据,我可以在正常的数据上修改字符串,添加总数等。 但是我不知道如何为对象这么做。

我要像做

my $thr2 = threads->new(\&processTime, @object); 

(例如是不正确的,只是我想怎么处理,是一个想法)

因此,因此我需要你们的帮助,以帮助我通过线程处理对象。谢谢

+0

为什么你想通过线程处理数据? – ysth 2011-01-27 07:39:51

+0

我将有许多不同的处理模块/子工具,我希望它们可以同时运行,并且一些日志可能也很长。对于线程和顺序处理的时机,我也是一个实验。 这些模块也是某种插件子,所以在我编写了一个新的处理算法之后,我只需将它插入一个新的线程并运行即可。 – robobooga 2011-01-27 07:42:14

回答

2

如果你想要的只是并发处理,那么分叉而不是使用线程的问题会少得多。一个流行的分叉库是Parallel::ForkManager,虽然有其他人。

如果您觉得您必须使用线程,请参见Thread::Queue,但请注意其建议以仔细阅读threads :: shared错误和限制部分,尤其是阅读example of a share-safe class

而且,在perl5中,数组元素的访问形式为$object[$index],而不是@object[$index];后者是一个数组切片,在许多情况下它们的工作原理是一样的,但效率较低。如果您启用了警告(您应该),则应该看到有关警告。

0

IIRC perl在多线程使用的任何对象(ref)上进行copy-on-write写操作,除非对象明确标记为共享。阅读threads :: shared perldoc页面。

+0

在threads :: shared页面中,他们有这个#不能直接重新映射内部对象18。 #bless($ foo - > {'bar'},'Yang'); 这是否意味着在我的子集中,我无法设置值 @object [$ index] - > time(“01:22:25”); 以这种方式? – robobooga 2011-01-27 08:08:51