免费注册 查看新帖 |

Chinaunix

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

关于多线程threading的疑问 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-02-27 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-30 17:50 |只看该作者 |倒序浏览
再次请教。。。因为要测试的ip很多,这里用到了threading,但感觉没看明白。。。,以下是遇到的一个问题,请不吝指教!
  1. #!/usr/bin/env python
  2. import os
  3. import time
  4. from threading import Thread


  5. class myThread(Thread):
  6.         def __init__(self,ip):
  7.                 Thread.__init__(self)
  8.                 self.ip = ip
  9.         def run(self):
  10.                 global ping_ok
  11.                 global ping_fail
  12.                 if os.system('ping -c 1  %s >/dev/null 2>&1' % self.ip) == 0:
  13.                         print '%s \t ok!' % self.ip
  14.                         ping_ok += 1
  15.                 else:
  16.                         print '%s \t bad!' % self.ip
  17.                         ping_fail += 1


  18. ping_fail = 0
  19. ping_ok = 0
  20. total = len(range(1,255))
  21. print time.ctime()
  22. for num in range(1,255):
  23.         ip = '192.168.30.' + str(num)
  24.         doip = myThread(ip)
  25.         doip.start()

  26. print time.ctime()
  27. print ping_ok,ping_fail,total
复制代码
这里针对一个c网段进行ping测试,并得到最终结果,但输出是:
Fri Apr 30 17:43:03 2010
192.168.30.8     ok!
192.168.30.1     ok!
192.168.30.5     ok!
192.168.30.69    ok!
192.168.30.100   ok!
192.168.30.147   ok!
Fri Apr 30 17:43:04 2010
6 0 254
192.168.30.10    bad!
192.168.30.12    bad!
....
....

ping通的数据有记录到,但ping不通的则没有记录!
threading好像没有等到最后的线程数据返回就执行最后的print了。
但如果加上doip.join()等待线程返回。。。过程则跟没有使用threading一样。。。相当慢

请问这里应该如何修改?or 哪里有问题?

论坛徽章:
0
2 [报告]
发表于 2010-04-30 19:17 |只看该作者
两百多个线程对全局变量不加限制的访问,基本没有正常工作的可能。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-02-27 06:20:00
3 [报告]
发表于 2010-04-30 20:12 |只看该作者
两百多个线程对全局变量不加限制的访问,基本没有正常工作的可能。
luffy.deng 发表于 2010-04-30 19:17



你是指glocal 的ping_fail & ping_ok两个变量影响到了多线程的正常工作?

是否要使用队列queue来限制?

论坛徽章:
0
4 [报告]
发表于 2010-04-30 22:52 |只看该作者
保护变量,这里用Lock更方便。

然后创建MyThread的时候,传一个Event进去。run结束的时候,set这个Event。最后print结果之前,检查所有的event都is_set了。

多线程编程,很太麻烦了。

论坛徽章:
0
5 [报告]
发表于 2010-05-03 10:39 |只看该作者
本帖最后由 luffy.deng 于 2010-05-03 10:41 编辑

回复 1# harmful_001

join不会变慢,下面是我在xp下试的结果 ,不到15秒就执行完,倒是启两百多个ping进程cpu负载一下就上来了。另外多个线程修改全局变量需要保护措施,办法很多 最简单的加锁就可以。
  1. import os
  2. import time
  3. from threading import Thread
  4. class myThread(Thread):
  5.         def __init__(self,ip):
  6.                 Thread.__init__(self)
  7.                 self.ip = ip
  8.         def run(self):
  9.                 if os.system('ping -n 1 %s >nul 2>&1' % self.ip) == 0:
  10.                         print '%s \t ok!' % self.ip
  11.                 else:
  12.                         print '%s \t bad!' % self.ip
  13. print time.ctime()
  14. threadList=[]
  15. for num in range(1,255):
  16.         doip = myThread('10.60.33.' + str(num))
  17.         threadList.append(doip)
  18.         doip.start()
  19. for p in threadList:
  20.         p.join()
  21. print time.ctime()
复制代码

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-02-27 06:20:00
6 [报告]
发表于 2010-05-04 17:58 |只看该作者
之前join用错地方了,导致很慢。修改加上lock后就没问题了。
在linux下ping一个C段用了4s,且cpu没升上来,相当快呵呵

threading还是挺有意思的。

谢谢luffy!

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-09-01 06:20:00
7 [报告]
发表于 2016-01-19 20:49 |只看该作者
加了什么类型的锁???

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-01-15 06:20:00操作系统版块每日发帖之星
日期:2016-01-16 06:20:00IT运维版块每日发帖之星
日期:2016-02-04 06:20:00数据库技术版块每日发帖之星
日期:2016-02-04 06:20:00程序设计版块每日发帖之星
日期:2016-02-10 06:20:01每日论坛发贴之星
日期:2016-02-10 06:20:01
8 [报告]
发表于 2016-01-19 22:48 |只看该作者
推荐使用multiprocessing里边的pool,非常方便,实现起来也很容易
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP