关于perl多线程的问题

关于perl多线程的问题



[Copy to clipboard] [ - ]
CODE:
for (my $i=0; $i<scalar(@_k); $i++) {

        my $city=$_k[$i];               
        my $url        ="http://".$cityName{$_k[$i]}[0].";
        my $thr        =threads->new(\&getInfo, $city , $url, $d1);
        $thr->join;
}

为了简单,我省略了部分代码,
我的目的是分多个线程去读不同页面的信息,
这样写对么?这样用的时间和正常用for直接执行时间就差1秒

还有一个问题,就是这些线程都执行完毕以后,主程序的代码好像没有执行
如何让这些线程执行完毕,再继续执行for后面的代码?
谢谢指教!
还是我以前说过的一个问题。
你把$thr->join;放在循环中,导致线程还是串行执行的。
你需要在循环外部join线程,这样才是多线程并行。
会阻塞在$thr->join;
是这个道理!
如果我要开的线程数量不确定,
怎么才能不用循环将每个线程join进去呢?


QUOTE:
原帖由 yzcdf 于 2008-12-25 13:10 发表
是这个道理!
如果我要开的线程数量不确定,
怎么才能不用循环将每个线程join进去呢?

跟创建一样循环join?
把每个线程保存到array然后再循环join如何
把每个线程保存到array然后再循环join,和循环创建,在创建时join,效果不一样么?
不太清楚,我想是一样的,现在的数据量不大,还体会不出来,
等测试一下再说。

现在有新的问题,每个创建的线程是相互独立的么?
为什么在每个线程里面执行数据库操作,系统提示“内存不能为read”
然后就跳出来,请明示下!
不需要获取返回值的时候,何必非要join呢?
你看看我的这个文章吧,http://www.icylife.net/yunshu/show.php?id=617
我测试了一下,是不一样的
保存array里面虽然有先后关系,但基本还是并发的

你直接在for里面join就相当于在循环里面创建一个线程,并立刻等待这个进程退出,然后才会创建下一个线程
所以还只是顺序执行而已
确实,应该是创建时放在数组,然后循环join,效果是不一样的,:)

还有一个问题,我在每个线程里面有读取数据库、插入数据库的操作,
有什么需要注意的么?
现在

[Copy to clipboard] [ - ]
CODE:
my $db        = new Win32::ODBC($DSN);
my $chkUrlSql="select ID from secondhandCaiJi where srcUrl like '$_secUrl'";
$db->Sql($chkUrlSql);
$db->FetchRow();

这样都能过去,只要放上

[Copy to clipboard] [ - ]
CODE:
my $infoID = $db->Data("ID");

就报错:内存不能为read