首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你最近有用的Perl单线程(或涉及Perl的管道)是什么?

Perl单线程(Perl threading)是在Perl编程语言中,对执行中的Perl脚本进行并发操作的一种技术。Perl使用线程化(threading)可以更快地处理I/O任务,减少程序响应时间,从而提高用户体验。这里介绍一个实际运用Perl单线程(Perl threading)的例子,并给出相应使用的代码和解释。

例:在命令行界面上通过管道将一个文本文件的内容输出到另一个文本文件,并计算文件内容的平均输出速度。

  1. 首先,使用文本编辑器生成一个文件,其中包含文本内容(例如输出速度记录),保存为input.txt
  2. 使用Perl单线程的脚本处理如下:
代码语言:perl
复制
use threads;
use threads::shared;
use threads::queue;

# 初始化一个空的哈希表,便于使用线程间的共享数据
my %shared;

# 初始化一个空的管道
my $pipe_file = \*ARGV[-1];
open my $pipe_FH, ">>", $pipe_file or die "打开管道失败: $!";
close $pipe_FH;

# 定义一个函数,执行输入文件的内容,并添加时间信息
sub process_input {
    my ($cmd, %input) = @_;
    my @output = `$cmd`;
    my $time_info = join ', ', @output[grep !/^\s*[a-z0-9]/, 0..$#output]; # 提取时间信息
    my $message = "$input{cmd} on $time_info took " . (time - $^T) . " seconds.\n";
    $shared{$message} = $time_info; # 添加共享值
    $| = 1; # 启动管道缓冲区
}

# 生产者在Perl 线程 0上运行
my $q = threads::queue->new; # 使用一个空的队列来控制生产者的进度(即,创建线程)
foreach my $file (@ARGV) {
    open my $file_FH, "<", $file or die "打开文件失败: $!";
    next if eof $file_FH;  # 忽略空文件
    readline $file_FH; # 继续读取文件内容直到文件结束
    push $q, {cmd => "./your/expensive/processing/*.pl", input => {file => $file}};
}

my $t = threads->create(\&process_input, "cat", \%shared); # 生产者提交命令和共享的数据到生产者线程0
my $pid = $$ # 保存当前进程的 pid,用于停止后检查
while !$q->empty {
    $| = 1; # 启用管道缓冲区
    my $task = $q->dequeue_nb; # 取出任务并执行
    my @result = do $task->{cmd} || die "无法运行脚本: $!"; # 运行执行命令
    print join "\n", @result if $task->{input}->{file}; # 将输出打印到文件中
    close STDIN;  # 关闭输入文件并清理文件句柄
    close STDOUT; # 关闭标准输出文件并清理文件句柄
    close STDERR; # 关闭错误输出文件并清理文件句柄

    # 停止线程
    print "$pid finished processing " . $task->{input}->{file} . "\n";
    close $pipe_file; # 关闭管道文件
    exit(0);
}
threads->exit(); # 停止所有线程并释放内存

$q->join(); # 等待所有进程或线程完成执行

# 打印平均输出速度
my @times = values %shared;
my $average = (sum(@times, 0) / scalar @times) . "\n";
print "Average CPU time for this job: @$average seconds\n";
  1. 将上面的Perl脚本保存为“perl_script.pl”。
  2. 通过在命令行界面上运行以下命令调用上面的脚本:
代码语言:sh
复制
perl perl_script.pl input.txt > output.txt
  1. 打开最后生成的另一个文件“output.txt”,查看输出的结果。

通过上面的Perl单线程技术,可以有效利用多核处理器的优势,提高大型任务的执行效率或减轻程序的响应时间。同时,线程化的应用也可以减少程序资源浪费,提高程序效率。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

翻译:Perl代码审计:Perl脚本中存在问题与存在安全风险

本文将展示perl语言不正确使用方式,错误使用方式又是如何对运行程序用户,及系统构成威胁。本文也会展示如何利用这些漏洞,以及如何修复避免它们。...任何时候程序可能会从一个不受信任用户那里获取输入,即使是间接都应该小心。例如,如果我们使用Perl编写CGI脚本,那么恶意用户可能会向您发送虚假输入。...任何一行命令只要涉及到用户输入脚本 都会面临讨论过所有安全问题。 有几种不同方法可以使shell不解释可能元字符,但最安全方法是不使用反勾号。...当你仅通过指定外部应用程序实用程序相对路径从代码中访问该外部应用程序实用程序时,会使整个程序及其运行系统安全性受到影响。...这可能有用,但也可能非常危险。首先,如果攻击者找到了利用脚本弱点方法,他们不仅可以访问系统,还可以使用该脚本有效UID(通常是“根”UID)权限访问系统。

2.6K51

GNU Parallel具体使用

是什么? GNU Parallel是一个shell工具,为了在一台多台计算机上并行执行计算任务,一个计算任务可以是一条shell命令或者一个以每一行做为输入脚本程序。...通常输入是文件列表、主机列表、用户列表、URL列表或者表格列表;一个计算任务也可以是一个从管道读取一条命令。GNU Parallel会把输入分块,然后通过管道并行执行。...如果会使用xargs和tee命令,会发现GNU Parallel非常易于使用,因为GNU Parallel具有与xargs一样选项。...指南 本教程展示了绝大多数GNU Parallel功能。旨在介绍GNU Parallel中一个选项,而非讲解真实世界中使用例子。花一个小时时间学习本教程,会由此爱上上命令行。...可以指定分隔符替代 ::: ::::,当这两个符号被其它命令占用时候会特别有用: parallel --arg-sep ,, echo ,, A B C :::: def-file 输出: A

3.2K10

Python3和Go成最大赢家?一张主流编程语言变迁图讲清程序员迁移模式

也许这张流程图对我来说,能揭示更多内容。 声明:在此处,不考虑程序员最喜欢是什么语言。人们可以在任意两个语言之间切换,也可以学习很多种语言、然后选择最适合工作一种语言。...它可以在旁边用一个独立框来表示,和其他语言之间没有出入箭头,不过这没关系。Haskell 是个自嘲式大笑话,除非涉及到 Monads,它不再使用 I/O 概念。...sh Perl。...对于胶水程序,很多人会直接从 C( C++)转到 Python 2。我最近也这样做过。和怪异 Perl 不同,Python 2 类似 C 语言风格,其语法更简单。...03 胶水语言简要介绍 最初胶水语言是 Unix shell,它因引入“管道”概念也很著名。“管道”连接简便工具来完成复杂工作。

1.1K30

生信自动化流程搭建 02 | 脚本

它可以是通常在终端 shell 程序通用Bash脚本中使用任何命令,脚本它们组合。 可以在脚本语句中使用命令唯一限制是目标执行系统中这些程序可用性。...使用其他语言脚本 默认情况下,Nextflow流程脚本为Bash脚本,但您不仅限于此。 您可以使用自己喜欢脚本语言(例如Perl,Python,Ruby,R等),甚至可以将它们混合在同一管道中。...例如,对于某些进程,R可能比Perl有用,在其他进程中,您可能需要使用Python,因为它提供了对库API等更好访问。 要使用Bash以外脚本,只需使用相应shebang声明启动流程脚本 。...这对于自主地(即独立于Nextflow执行)测试脚本非常有用。 您只需为脚本中存在每个Nextflow变量提供一个Bash环境变量。...这意味着,您无需指定要作为字符串脚本执行process命令,而是可以提供一种多种语言语句来定义它,就像在其余管道脚本中一样。

2.4K10

2021 年,这8种编程语言最流行

有这么多不断变化语言,很难知道该从何处入手,尤其是开源语言一直在变化,新包和框架不断涌现。无论兴趣需求是什么,如果你想了解 2021 年最流行编程语言,可以从本文这个列表中找到它们。...2对不想从事编程工作的人来说,最流行编程语言是 R ? 当我担任客户成功经理时,我工作完全不涉及编程。但是,我仍然发现能够在 R 中进行分析,查看保留率、流失率、交流量等等,这是非常有用。...非程序员学习 R 最佳方法 尤其是对于那些没有不想从事编程工作的人来说,我认为最好是找一个真正关心项目,然后设定一个明确目标。没有工作必要——至少现在你可以不知道如何编程。...一旦掌握了基础知识,其他一些很棒资源,包括《实例学习 Go 语言》(Go By Example)和《精通 Go》(Go Mastery),在这些资源中,将学会如何发现代码实例,用于典型常见任务...出于这一原因,他们建议加入 Discord 频道,以此作为获得导师和支持性社区学习 Rust 途径。 9结语 正如你从这个列表所看到,现在有很多编程语言可供选择,其中很多都是最近才出现

98630

MySQL数据库层优化基本概念

使系统快速运行最重要因素是其基本设计。您还必须知道系统正在执行哪种处理以及其瓶颈是什么。在大多数情况下,系统瓶颈来自以下来源: 磁盘搜索。磁盘查找数据需要花费时间。...另一方面,当您尝试访问最近更新行(直到将它们刷新到磁盘)时,Oracle遇到了一个大问题。事务数据库系统通常不能很好地从日志表生成摘要表,因为在这种情况下,行锁定几乎没有用。...从所有商店,我们每周都会获得所有奖励卡交易摘要,并有望为商店所有者提供有用信息,以帮助他们找到广告活动如何影响自己客户。...这些报告是由小型Perl脚本动态生成网页。该脚本解析网页,在其中执行SQL语句,然后插入结果。我们本来会使用PHPmod_perl,但是当时它们不可用。...请注意,该基准测试是单线程,因此它测量执行操作最短时间。我们计划将来将多线程测试添加到基准套件中。 要使用基准套件,必须满足以下要求: 基准套件随MySQL源分发一起提供。

1.4K20

程序员迁移模式

(而且我跳过了Haskell,因为......好吧,我认为它只是一个漂浮盒子,没有箭头标识进出,除非你涉及Monads,否则Haskell会排除掉I / O概念。)...胶水程序员使用shperl。...对于胶水语言,许多人直接从C(C ++)跳到python 2,与perl古怪不同,Python 2是一种熟悉类C语言,语法更简单。...首先是awk,它是一种可以在shell管道中使用C语法外观解析器语言。 接下来是Perl,受到了awk“启发”,因为awk没有足够标点符号。(好吧,开个玩笑。有点。)...这使得“胶水”工作空间在几个方向上断裂。如果认为perl语法很难看,可能会切换到python。如果认为perl语法是惊人和强大,只需要一些调整,可能切换到ruby。

79430

【天枢系列 01】Linux行数统计:命令对决,谁才是王者?

wc 命令是一个简单而强大文本统计工具,可用于快速查看文件基本信息,如大小、长度和行数。它在日常文件处理和分析工作中非常有用。...06 Linux Perl 命令详细用法 在Linux中,Perl命令提供了强大文本处理功能,它允许使用Perl语言特性来进行文本处理和脚本编程。...Perl是一种高级脚本语言,具有强大正则表达式支持和丰富内置函数库,因此在文本处理和系统管理方面非常有用。 6.1 示例用法 Perl命令基本语法类似于在Perl脚本中使用语法。...文件权限: 如果要执行Perl脚本位于受限制目录中,或者是其他用户创建,确保有执行该脚本权限。在执行Perl脚本时,需要注意文件权限设置。...依赖模块: 如果Perl脚本依赖于某些模块,确保这些模块已经安装并可用。可以使用 cpan 或者其他Perl模块管理工具来安装所需模块。

16110

2021 年,这8种编程语言最流行

有这么多不断变化语言,很难知道该从何处入手,尤其是开源语言一直在变化,新包和框架不断涌现。无论兴趣需求是什么,如果你想了解 2021 年最流行编程语言,可以从本文这个列表中找到它们。...2对不想从事编程工作的人来说,最流行编程语言是 R 当我担任客户成功经理时,我工作完全不涉及编程。但是,我仍然发现能够在 R 中进行分析,查看保留率、流失率、交流量等等,这是非常有用。...非程序员学习 R 最佳方法 尤其是对于那些没有不想从事编程工作的人来说,我认为最好是找一个真正关心项目,然后设定一个明确目标。没有工作必要——至少现在你可以不知道如何编程。...一旦掌握了基础知识,其他一些很棒资源,包括《实例学习 Go 语言》(Go By Example)和《精通 Go》(Go Mastery),在这些资源中,将学会如何发现代码实例,用于典型常见任务...出于这一原因,他们建议加入 Discord 频道,以此作为获得导师和支持性社区学习 Rust 途径。 9结语 正如你从这个列表所看到,现在有很多编程语言可供选择,其中很多都是最近才出现

1.6K40

各种编程语言优缺点

不需要知道 Mailman 是什么东西。除非你是个 Amazon 老员工,或许不是搞技术,而且曾经不得不让客户哈皮 (只有在这种情况下才需要知道 Mailman,译者注)。...但是 Perl 有很多很多好特性,直到最近,都是其他语言没有的。它们弥补了 Perl 肠子在外不足。可以从爆了肚皮鲸鱼可以做很多有用东西出来,比如香水。这很有用Perl 也是这样。...今天Perl 书,小教程 PPT 时候,不花三分之一时间在“引用”上是不可能。这就是 Larry 可怜,坏了,Goldberg (漫画家,想起来没?...Perl 面向对象是个半成品,且在 Perl 社区里没多少人重视。它就是不像字符串处理 Unix 集成那样充满灵感。 当然了,Perl 还有其他很多怪怪特性。...但就像我说—直到最近,没啥能像 Perl 那样把屎搞定。 Ruby 每过 15 年左右,一门语言就会被更好代替。C被 C++ 代替,至少对大应用开发而又需要性能和数据类型的人们来说。

4.4K60

如何像黑客一样聊天 Mojo-Webqq

推荐使用cpanm在线安装升级Mojo::Webqq模块, 如果使用docker方式请参见Docker镜像安装及使用方法 安装perl 安装之前请先确认下系统是否已经安装了Perl,因为除了windows...,其他大部分平台默认都可能已经预装过 并且Perl版本至少5.10.1+,推荐5.14+ Perl官网下载页面 有包含Unix/Linux、Mac OS X、Windows多平台比较全面详细安装说明...$ cpanm --mirror http://mirrors.163.com/cpan/ Mojo::Webqq 安装失败可能有帮助解决方法如果运气不佳,通过cpanm没有一次性安装成功,这里提供了一些可能有用信息在安装...:SSL 主要提供了 https 支持,在安装过程中可能会涉及到SSL相关库编译 对于 Linux 用户,通常采用是编译安装方式,系统缺少编译安装必要环境,则会导致编译失败 对于 Windows...,再重新回到 步骤2 安装Mojo::Webqq即可 使用Perl语言编写Smartqq客户端框架,基于Mojolicious,要求Perl版本5.10+,可通过插件提供基于HTTP协议api接口供其他语言系统调用

1.3K40

Perl正则表达式超详细教程

所以,我把如何使用perl正则来匹配数据放在最开头介绍,包括匹配指定字符串、匹配变量、匹配标准输入(如管道传递数据)以及匹配文件中每一行数据,而且后文我假设各位和我当初一样,完全没有perl语言基础...中,对于需要参数函数表达式,但却没有给参数,这是将会使用perl默认参数变量$_。...5.读取标准输入 perl中使用一对尖括号格式来读取来自非文件标准输入,例如来自管道数据,来自输入重定向数据或者来自键盘输入。...出于方便,我全部都直接在perl程序内部定义待匹配内容,如果想要匹配管道传递输入,或者匹配文件数据,请看上文获取操作方法。...*最终匹配内容是”a1122c”。 上面涉及到回溯概念,也就是将那些已经被量词匹配内容回退释放。

6.1K30

亚马逊工程师论各种编程语言优缺点

不需要知道 Mailman 是什么东西。除非你是个 Amazon 老员工,或许不是搞技术,而且曾经不得不让客户哈皮 (只有在这种情况下才需要知道 Mailman,译者注)。...但是 Perl 有很多很多好特性,直到最近,都是其他语言没有的。它们弥补了 Perl 肠子在外不足。可以从爆了肚皮鲸鱼可以做很多有用东西出来,比如香水。这很有用。...今天Perl 书,小教程 PPT 时候,不花三分之一时间在“引用”上是不可能。这就是 Larry 可怜,坏了,Goldberg (漫画家,想起来没?...Perl 面向对象是个半成品,且在 Perl 社区里没多少人重视。它就是不像字符串处理 Unix 集成那样充满灵感。   当然了,Perl 还有其他很多怪怪特性。...但就像我说—直到最近,没啥能像 Perl 那样把屎搞定。 Ruby   每过 15 年左右,一门语言就会被更好代替。C被 C++ 代替,至少对大应用开发而又需要性能和数据类型的人们来说。

2.2K80

几种编程语言优缺点

不需要知道 Mailman 是什么东西。除非你是个 Amazon 老员工,或许不是搞技术,而且曾经不得不让客户哈皮 (只有在这种情况下才需要知道 Mailman,译者注)。...但是 Perl 有很多很多好特性,直到最近,都是其他语言没有的。它们弥补了 Perl 肠子在外不足。可以从爆了肚皮鲸鱼可以做很多有用东西出来,比如香水。这很有用Perl 也是这样。...今天Perl 书,小教程 PPT 时候,不花三分之一时间在“引用”上是不可能。这就是 Larry 可怜,坏了,Goldberg (漫画家,想起来没?...Perl 面向对象是个半成品,且在 Perl 社区里没多少人重视。它就是不像字符串处理 Unix 集成那样充满灵感。 当然了,Perl 还有其他很多怪怪特性。...但就像我说—直到最近,没啥能像 Perl 那样把屎搞定。 Ruby 每过 15 年左右,一门语言就会被更好代替。C被 C++ 代替,至少对大应用开发而又需要性能和数据类型的人们来说。

3.4K110
领券