Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Net::LDAP和并行::Forkmanager可以一起工作吗?

Net::LDAP和并行::Forkmanager可以一起工作吗?
EN

Stack Overflow用户
提问于 2015-03-05 22:42:19
回答 1查看 126关注 0票数 0

我需要通过Net::LDAP查询perl中的不同LDAP服务器。我有些东西很好用。然而,为了加快速度,我尝试使用并行::Forkmanager并行地查询不同的服务器--当我这样做时,事情就不能工作了。

我得到以下类型的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 decode error 02<=>30 0 8  at /Users/myname/perl5/perlbrew/perls/perl-5.18.2/lib/site_perl/5.18.2/Convert/ASN1/_decode.pm line 113, <> line 18.
 decode error 43<=>30 0 8  at /Users/myname/perl5/perlbrew/perls/perl-5.18.2/lib/site_perl/5.18.2/Convert/ASN1/_decode.pm line 113, <> line 25.

在获得搜索响应的行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$mesg = $ldap->search( base => $dn, filter => '(CN=*)');

我很困惑。

换句话说,为什么这样做失败了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use Net::LDAP;
use Parallel::Forkmanager;

...; # bind LDAP servers

while (<>) {
    chop;
    my $dn = $_;
    foreach my $ldap (@servers) {
        my $pid;
        $pid = $pm->start and next; # do the fork
        print $dn, $pid;
        my $mesg;
        try {
            $mesg = $ldap->search( base => $dn, filter => '(CN=*)');
        } catch {
            ...;
        }
        $pm->finish;
    }
}

而这一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use Net::LDAP;

...; # bind LDAP servers

while (<>) {
    chop;
    my $dn = $_;
    foreach my $ldap (@servers) {
        print $dn;
        my $mesg;
        try {
            $mesg = $ldap->search( base => $dn, filter => '(CN=*)');
        } catch {
            ...;
        }
    }
}

效果很好吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-06 01:40:47

虽然forking没有完全相同的线程安全问题,但threading仍然有一些地方。我认为这就是让您头疼的地方--您的Net::LDAP对象是在父线程中创建的,但是当您分叉时(实际上)将它们克隆到每个线程。

这意味着在您的代码中--如果您有足够快的名称列表,那么一个新的分叉将尝试重用一个现有的Net::LDAP连接,然后再完成上一个连接。

防止这种情况的简单方法是调用wait_all_children,以确保在下一个查询开始之前完成所有并行的LDAP查询。

如果将LDAP绑定放在ForkManager循环中,那么仍然存在相同的问题吗?我理解这是一种潜在的开销,因为您将在每次迭代中绑定,但是如果这解决了这个问题,我建议这是因为Net::LDAP在叉子之间共享相同的文件描述符。

下一个最好的解决方案是采用“worker”模型,其中有一群“工人”,每个人都有他们在LDAP上的连接来进行查询。与forking相比,线程处理要容易得多:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/perl

use strict;
use warnings;

use threads;
use Thread::Queue;

sub server_worker {
    my ( $hostname, $q_ref ) = @_;

    ## connect LDAP to $hostname;
    while ( my $dn = $$q_ref->dequeue ) {

        #query $dn
    }
}

my @queues;

foreach my $server (@list_of_servers) {
    my $server_q = Threads::Queue->new();
    push( @queues, $server_q );
    threads->create( \&server_worker, $hostname, \$server_q );
}

while ( my $dn = <STDIN> ) {
    chomp($dn);
    foreach my $q (@queues) {
        $q->enqueue($dn);
    }
}

foreach my $q ( @queues ) { 
    $q -> end;
}

foreach my $thr ( threads->list ) {
    $thr->join();
}

用叉子做类似的事情应该有效:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/perl

use strict;
use warnings;

use IO::Pipe;
use Parallel::ForkManager;
use Net::LDAP;

my @list_of_servers = qw ( servername servenama anotherserver );

my $pm = Parallel::ForkManager -> new ( scalar @list_of_servers );

my %pipe_for;

foreach my $server ( @list_of_servers ) {
   my $pipe = IO::Pipe -> new();
   my $pid = pm -> start;
   if ( $pid ) {
       print "$$: parent\n";
       $pipe -> writer -> autoflush;
       $pipe_for{$server} = $pipe;
   }
   else {
       print "$$ child connecting to $server\n"; 
       $pipe -> reader -> autoflush;
       close ( STDIN ); #because this is a child. 
        #Net::LDAP setup
       while ( my $item =  <$pipe> ) {
           chomp ( $item );
            #ldap_search $item;
       }
    }
   $pm -> finish; 
}

然后发送东西:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for my $number ( 1..10 ) { 
   foreach my $pipe ( values %pipe_for ) { 
       print {$pipe} "test$number\n";
   }
}

$pm -> wait_all_children();

编辑:注意--自动刷新很重要,否则IO缓冲区就不工作了。我非常肯定,关闭STDIN对孩子来说可能是个好主意,但如果他们不使用STDIN的话,也许并不是绝对必要的。

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

https://stackoverflow.com/questions/28893550

复制
相关文章
Laravel项目部署后,出现 file_put_contents ()
问题: 部署博客,服务器经常500 排查:查看laravel日志: file_put_contents () ,failed to open stream: No such file or directory;
陈大剩博客
2023/03/06
1.7K0
Laravel项目部署后,出现 file_put_contents ()
js -- 判断数组是否为空?
上面三种判断数组为空的方法虽然大多数情况下都可以用,但依然存在bug,比如令arr[-1] = ''时,数组不为空,但三者都返回true。
小蔚
2020/09/07
20.5K0
IOS数组为空的处理
某些情况下,后台可能由于各种原因,对某个字段返回了null值,这时我们取到的就是[NSNull null]这样一个对象,再比如说,后台可能对某一个数据取值,但取到了0个,这时返回的是一个空组,我们取到的就是@[],空组。 取到的array是一个NSNull对象。 NSNull是一个特殊的类,它和nil一样,也代表空值,但二者有区别,NSNull不接收NSArray的那些方法,它只有一个类方法: 因此判断数组是否为空,需要对各种情况都进行判断。 比如这种情况: ( "<null>", "<null>",
rectinajh
2018/05/17
3.4K0
VBA: 判断动态数组是否为空
文章背景:在VBA代码中,有时需要创建动态数组,然后对该动态数组进行操作。如果该数组为空,在使用一些函数(如Lbound,Ubound等)时,代码会报错。因此,需要事先判断动态数组是否为空。下面介绍一个判断动态数组是否为空的自定义函数。
Exploring
2022/09/20
4.9K0
在AWS云上的SAP
虽然最近亚马逊在迁离Oracle的数据库,使用Aurora PostgreSQL导致Prime Day促销日出现故障,但这似乎并不影响Amazon Aurora 数据库的推进,并且亚马逊一直在说Amazon Aurora兼容MySQL和PostgreSQL,是一种将数据库迁移到云的优秀工具。可见其要脱离Oracle的决心。而SAP也做出了同样的事情,在以前的SAP ERP系统里,SAP一直使用着别人的数据库,比如Oracle,后来SAP推出了HANA内存数据库,在S/4 HANA系列版本中,成功的使用了自己研发的数据库。可以看出这两家企业都想离开Oracle,所以合作是必然的事。
matinal
2019/01/04
2.3K0
在AWS云上的SAP
使用 Envoy 部署 Laravel 项目
我们的项目是基于 Git 托管,每次部署项目的时候都是登录服务器手动拉取,感觉很繁琐。
hedeqiang
2019/12/17
8130
laravel使用aws笔记
一、引入composer "aws/aws-sdk-php": "^3.137", "league/flysystem-aws-s3-v3": "^1.0" 二、添加配置 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), #key 'secret' => env('AWS_SECRET_ACCESS_KEY'), #秘钥 're
苦咖啡
2020/05/12
1.2K0
【PHP】Largon 快速部署 Laravel 项目
Largon部署Laravel非常简单,只要对于PHP的一些组件进行相关了解即可:
阿东
2022/12/21
3.1K0
【PHP】Largon 快速部署 Laravel 项目
在Windows上安装Docker并部署Node项目
为啥要在Windows上装Docker呢?在Windows上又不能发挥Docker的优势!!
码客说
2021/03/23
4.1K0
腾讯云-云主机弹性伸缩
本文提供视频讲解,详细见地址:https://www.bilibili.com/video/BV1iv411v7xm
研究僧
2020/08/15
34.9K0
创建Django项目并将其部署在腾讯云上
这段时间在做scrapy爬虫,对爬出来的数据基于Django做了统计与可视化,本想部署在腾讯云上玩玩,但是因为以前没有经验遇到了一些问题,在这里记录一下:
py3study
2020/01/19
4.1K0
创建Django项目并将其部署在腾讯云上
关于Linux服务器部署laravel项目
关于Linux服务器部署laravel项目 这篇说下在Linux Ubuntu服务器中部署laravel项目吧 下载laravel5.5最新版(推荐使用composer) composer create-project --prefer-dist laravel/laravel laravel-wechat 我这里的laravel-wechat是我的项目名,你可以随便定义 接下来配置一个站点 sudo cp /etc/nginx/sites-available/default /etc/nginx/site
hedeqiang
2019/12/18
1.8K0
Oracle ASM diskgroup在主机重启后启动失败
环境:RHEL 6.4 + Oracle 11.2.0.3 + ASM单实例 1.重启主机后,+DATA diskgroup启动不成功,现象如下: [grid@JY-DB ~]$ crsctl stat res -t -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE
Alfred Zhao
2019/05/24
1.5K0
在Laravel中使用数据库事务以及捕获事务失败后的异常
在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法。如果在事务的闭包内抛出异常,事务将会被自动还原。如果闭包运行成功,事务将被自动提交。你不需要担心在使用 transaction 方法时还需要亲自去手动还原或提交事务:
全栈程序员站长
2022/07/08
1.3K0
在Laravel中使用数据库事务以及捕获事务失败后的异常
刷新页面后this.$route.params 为空
深入学习 vue-router时,按官方文档的教程看下来,结果发现刷新页面后,打印的this.$route.params 为空
赤蓝紫
2023/01/05
9560
刷新页面后this.$route.params 为空
Serverless无服务器架构详解
Serverless: 无服务器架构,即在无需管理服务器等底层资源的情况下完成应用的开发和运行,是云原生架构的核心组成部分。
zhayujie
2020/08/03
4.5K0
Serverless无服务器架构详解
js判断元素在不在数组中_js判断数组是否为空
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180608.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
15.9K0
jq 判断是否为空,为空隐藏指定 div
<style>.mydiv{ width:300px; height:300px; background:red;}</style> <div class="mydiv">     <div class="content">          这是一句话,删除的话会让 mydiv display:none;          </div> </div> <script src="https://lib.baomitu.com/jquery/3.4.1/jquery.min.js"></script> <sc
Savalone
2020/02/11
7.1K0
点击加载更多

相似问题

使用JavaScript对象文字表示法的JavaScript构造函数

610

Javascript对象构造函数从未使用文字表示法调用?

14

Javascript对象文字表示法,使用函数

31

RegExp对象文字表示法与构造器表示法的区别

17

在javascript对象文字表示法声明中调用函数

52
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文