免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: fandatou
打印 上一主题 下一主题

请问pyhon开多线程费内存吗 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-12-11 15:21 |只看该作者
不明白,我就是开5个线程去抓网页,抓下来后正则分解写数据库,然后返回。

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:192015亚冠之广州恒大
日期:2015-07-22 17:20:15
22 [报告]
发表于 2006-12-12 17:33 |只看该作者
木头说得对,不然你有的链接有问题,那个线程死在那里占着cpu不放

论坛徽章:
0
23 [报告]
发表于 2006-12-14 01:07 |只看该作者
抓网页和写数据库都用try包围起来了。跑一些比较快的网站也cpu也是很高,回头弄个本地webserver试试看看开300个线程如何。

论坛徽章:
0
24 [报告]
发表于 2006-12-15 22:16 |只看该作者
应该是你写的程序的问题。
贴出来看看

[ 本帖最后由 phpbird 于 2006-12-15 22:18 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2006-12-19 13:48 |只看该作者
不知道Perl的线程是怎么回事,不过Py的线程,我只是说线程,不会占用那么多的内存。但是如果你用线程递归计算Hanoi塔,那么占用100G,我也不会觉得奇怪。

Py的线程是混合线程。所谓混合线程是指,就OS的角度看,Py解释器只有一个线程,所谓Python的多线程,实际上是解释器水平实现的。因此多核CPU,SMP之类的,对Py来说是白费劲。但是,Py的多线程也并不是完全没有例外。block的IO的时候,解释器就是以多线程方式运行的。

论坛徽章:
0
26 [报告]
发表于 2006-12-19 13:57 |只看该作者
估计是gabbage网页占了内存空间。

Py的垃圾回收机制和Java的有点类似。只要还有内存,他就不回收。所以用得多也正常。

我倒是从来不做垃圾回收。不知道gc.collect是不是能起作用。

论坛徽章:
0
27 [报告]
发表于 2006-12-19 21:31 |只看该作者
5个程序占用100%, 开300个不一样占100%嘛。。。

论坛徽章:
0
28 [报告]
发表于 2006-12-19 23:41 |只看该作者
抓网站的代码在这里
  1. def openurl(id):
  2.     url ="""http://""" + str(id) + """.xxx.com"""
  3.     print url
  4.     try:
  5.         html_date = urllib.urlopen(url).read()
  6.         #print html_date
  7.     except:
  8.         print 'find a error'
  9.         pass
  10.     else:
  11.         logfile='log/' + str(id) +".html"
  12.         open(logfile,'w').write(html_date)
  13.         error_re=re.compile(r"""(数据库暂时没有您要查找的数据)""")
  14.         companyinfo_re=re.compile(r"""<font style="font-size:12pt">(.*?)</font>""", re.S|re.M)
  15.         Mobile_re=re.compile(r"<td align=center>手机:</td>.*?<td align=center>(.*?)</td>", re.S|re.M)
  16.         Fax_re=re.compile(r"<td align=center>传真:</td>.*?<td align=center>(.*?)</td>", re.S|re.M)
  17.         clear_re= re.compile( r"(<.*?>|&nbsp;|\s+|\n|\t|\r|\\|/|')")
  18.         info_re=re.compile(r"(企业类型|.....|管理体系认证):</b></td>.*?<t.*?>(.*?)</td>", re.S|re.M)
  19.         db_user = ""
  20.         db_pw = ""
  21.         db = MySQLdb.connect("localhost", db_user, db_pw ,"。。。")
  22.         c = db.cursor()
  23.         if error_re.search(html_date):
  24.             print "数据库暂时没有您要查找的数据"
  25.             open('error.log','a').writelines(str(id)+"\n")
  26.             return
  27.         try:
  28.             
  29.             if info_re.finditer(html_date):
  30.                 companyinfo_group=companyinfo_re.search(html_date)
  31.                 temp_info=companyinfo_group.groups()[0]
  32.                 company_info=clear_re.sub('',temp_info)
  33.                 mobile_group=Mobile_re.search(html_date)
  34.                 mobile=clear_re.sub('',mobile_group.groups()[0])
  35.                 print mobile
  36.                 Fax_group=Fax_re.search(html_date)
  37.                 Fax=clear_re.sub('',Fax_group.groups()[0])
  38.                 print Fax
  39.                 company_dict={"":""}
  40.                 for m in info_re.finditer(html_date):
  41.                     info_cat=m.groups()[0]
  42.                     name=clear_re.sub('',m.groups()[1])
  43.                     company_dict[info_cat]=name
  44.                     print "%s %s %s " % (info_cat , "," ,name)
  45.                    insert_data="insert  into company (Company_ID.....) values ('" + str(id) + "' ..... +"')"
  46.                 c.execute(insert_data)
  47.                 open('work.log','a').writelines(str(id)+"\n")
  48.                 return
  49.             else:
  50.                 print "open url error"
  51.                 open('error.log','a').writelines(str(id)+"\n")
  52.                 return
  53.             
  54.         except:
  55.             print "数据有错误"
  56.             open('error.log','a').writelines(str(id)+"\n")
  57.             return

  58.             
  59.     #print url
复制代码

[ 本帖最后由 fandatou 于 2006-12-19 23:43 编辑 ]

论坛徽章:
0
29 [报告]
发表于 2007-08-22 22:29 |只看该作者

原因是perl的线程内存没有释放

原因是perl的线程内存一直没有释放,所以内存占得很多
可以加上new thread->(...)->join()或者new thread(...)->detach()

论坛徽章:
0
30 [报告]
发表于 2007-09-02 18:26 |只看该作者
嘻嘻,perl费内存,python的费点cpu,同样的程序写了2个版本的,2.4Gcpu和2
G内存物尽其用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP