免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1989 | 回复: 3
打印 上一主题 下一主题

Perl多线程中使用共享句柄的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-16 14:31 |只看该作者 |倒序浏览
应用场景如下:
服务器启动一个端口监听8000端口等待用户连接,当用户连接后用在线程中向客户机发送信息,因为是群播,所以就是在线程中遍历所有的连接句柄然后发送信息,所有的句柄信息都保存在%CLIENTS这个变量中,而%CLIENTS在线程中无法共享,所以也就没有客户的连接句柄可以使用,意味着说线程也就没法向客户端发送信息,使用threads::shared也无法共享%CLIENTS

目前客户连接和线程的过程如下
  1. #!/usr/bin/perl -w
  2. use EV;
  3. use AnyEvent;
  4. use AnyEvent::Handle;
  5. use AnyEvent::Socket;
  6. use threads;
  7. use threads::shared;
  8. use Thread::Queue;

  9. my $blockQueue = Thread::Queue->new();
  10. my $thr = threads->create(sub {
  11.     while (my $block = $blockQueue->dequeue()) {
  12.            $log->debug(Dumper(%CLIENTS));
  13.     }
  14.                           }                          
  15.     )->detach();

  16.    

  17. tcp_server undef, 8000 , \&new_client;
  18. EV::loop;

  19. #Handles new connections
  20. sub new_client {
  21.     my ( $fh, $host, $port ) = @_;
  22.     my $handle = new AnyEvent::Handle(
  23.         fh       => $fh,

  24.     );
  25.     $handle->on_read( \&client_input );
  26.     $CLIENTS{$handle} = $handle;

  27. }

  28. sub client_input {
  29.     return 1;
  30. }
复制代码


如何共享%CLIENTS的变量信息

论坛徽章:
0
2 [报告]
发表于 2012-02-17 11:34 |只看该作者
my %CLIENTS :shared = ...

论坛徽章:
0
3 [报告]
发表于 2012-02-20 09:24 |只看该作者
回复 2# lambda_calculus


呵呵。我在上面也已经说过这种方法不行,过去的不是对象,而变成了普通标量了

论坛徽章:
0
4 [报告]
发表于 2012-02-20 13:45 |只看该作者
anyevent传递变量的问题.........
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP