Chinaunix

标题: Perl多线程中使用共享句柄的问题 [打印本页]

作者: nsnake_cu    时间: 2012-02-16 14:31
标题: Perl多线程中使用共享句柄的问题
应用场景如下:
服务器启动一个端口监听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的变量信息
作者: lambda_calculus    时间: 2012-02-17 11:34
my %CLIENTS :shared = ...
作者: nsnake_cu    时间: 2012-02-20 09:24
回复 2# lambda_calculus


呵呵。我在上面也已经说过这种方法不行,过去的不是对象,而变成了普通标量了
作者: 斯文牛氓    时间: 2012-02-20 13:45
anyevent传递变量的问题.........




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2