首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl如何模拟线程行为

perl如何模拟线程行为
EN

Stack Overflow用户
提问于 2013-01-16 10:15:28
回答 1查看 246关注 0票数 2

我想用perl编写一个子程序的单元测试。子例程使用多个线程来执行其任务。因此,它首先创建一些线程,然后等待它们加入。

问题是,我们的单元测试运行在无法运行多线程测试的服务器上,因此我需要以某种方式模拟线程行为。基本上,我希望重写线程、创建和连接函数,使其不再是线程化的。任何指针,我如何做到这一点,并测试代码?

编辑:服务器无法运行线程代码,原因如下:

发展::盖子尚未与线程一起工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-16 11:51:03

更新:这个答案并不能像编辑的问题中描述的那样解决OP的问题,但是它可能对某些人有用。

Perl线程是解释器仿真,而不是操作系统特性。所以,他们应该在任何平台上工作。如果您的测试服务器不支持线程,那么可能是因为以下原因之一:

  1. 您的Perl版本非常老。
  2. Perl是在没有线程支持的情况下编译的。
  3. 您的测试框架不是在创建线程代码的情况下创建的。

通过更新您的环境,可以很容易地纠正前两个问题。然而,我怀疑你的问题是第三个问题。

我认为你不应该通过嘲笑线程行为来解决这个问题。这会使原始代码更改得太多,无法成为有效的测试。无论如何,这将是一项相当大的工作,那么为什么不将这一工作引向线程化测试呢?

确切的问题取决于您的代码,但问题可能是您的子例程启动一个线程,然后返回,线程仍然在运行。然后,您的测试框架一次又一次地运行该子程序,积累了大量并发线程。

在这种情况下,您所需要的只是一个包装器子,它调用要测试的子程序,然后阻塞直到线程完成。这应该相当简单。看看threads->list(),看看如何检测正在运行的线程。只需有一个循环,直到问题中的线程在退出包装子之前不再运行。

下面是一个简单的完整示例,演示包装器子:

代码语言:javascript
复制
#!usr/bin/perl
use strict;
use warnings;
use threads;

sub sub_to_test {

    threads->create(sub { sleep 5; print("Thread done\n"); threads->detach() });
    return "Sub done\n";
}

sub wrapper {
    #Get a count of the running threads.
    my $original_running_threads = threads->list(threads::running);

    my @results = sub_to_test(@_);

    #block until the number of running threads is the same as when we started.
    sleep 1 while (threads->list(threads::running) > $original_running_threads);

    return @results;
}

print wrapper;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14355977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档