免费注册 查看新帖 |

Chinaunix

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

关于perl多线程的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-25 09:17 |只看该作者 |倒序浏览


  1. for (my $i=0; $i<scalar(@_k); $i++) {

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

复制代码


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

还有一个问题,就是这些线程都执行完毕以后,主程序的代码好像没有执行
如何让这些线程执行完毕,再继续执行for后面的代码?
谢谢指教!

论坛徽章:
0
2 [报告]
发表于 2008-12-25 10:52 |只看该作者
还是我以前说过的一个问题。
你把$thr->join;放在循环中,导致线程还是串行执行的。
你需要在循环外部join线程,这样才是多线程并行。

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
3 [报告]
发表于 2008-12-25 11:14 |只看该作者
会阻塞在$thr->join;

论坛徽章:
0
4 [报告]
发表于 2008-12-25 13:10 |只看该作者
是这个道理!
如果我要开的线程数量不确定,
怎么才能不用循环将每个线程join进去呢?

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
5 [报告]
发表于 2008-12-25 13:26 |只看该作者
原帖由 yzcdf 于 2008-12-25 13:10 发表
是这个道理!
如果我要开的线程数量不确定,
怎么才能不用循环将每个线程join进去呢?

跟创建一样循环join?

论坛徽章:
0
6 [报告]
发表于 2008-12-25 14:59 |只看该作者
把每个线程保存到array然后再循环join如何

论坛徽章:
0
7 [报告]
发表于 2008-12-25 15:49 |只看该作者
把每个线程保存到array然后再循环join,和循环创建,在创建时join,效果不一样么?
不太清楚,我想是一样的,现在的数据量不大,还体会不出来,
等测试一下再说。

现在有新的问题,每个创建的线程是相互独立的么?
为什么在每个线程里面执行数据库操作,系统提示“内存不能为read”
然后就跳出来,请明示下!

论坛徽章:
0
8 [报告]
发表于 2008-12-25 17:05 |只看该作者
不需要获取返回值的时候,何必非要join呢?
你看看我的这个文章吧,http://www.icylife.net/yunshu/show.php?id=617

论坛徽章:
0
9 [报告]
发表于 2008-12-25 18:51 |只看该作者

回复 #7 yzcdf 的帖子

我测试了一下,是不一样的
保存array里面虽然有先后关系,但基本还是并发的

你直接在for里面join就相当于在循环里面创建一个线程,并立刻等待这个进程退出,然后才会创建下一个线程
所以还只是顺序执行而已

论坛徽章:
0
10 [报告]
发表于 2008-12-26 10:09 |只看该作者
确实,应该是创建时放在数组,然后循环join,效果是不一样的,:)

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

  1. my $db        = new Win32::ODBC($DSN);
  2. my $chkUrlSql="select ID from secondhandCaiJi where srcUrl like '$_secUrl'";
  3. $db->Sql($chkUrlSql);
  4. $db->FetchRow();
复制代码

这样都能过去,只要放上

  1. my $infoID = $db->Data("ID");
复制代码

就报错:内存不能为read
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP