【Python】獲取網(wǎng)頁(yè)標(biāo)題的工具第三版

什么是線(xiàn)程池惯豆?##

諸如web服務(wù)器害淤、數(shù)據(jù)庫(kù)服務(wù)器挖息、文件服務(wù)器和郵件服務(wù)器等許多服務(wù)器應(yīng)用都面向處理來(lái)自某些遠(yuǎn)程來(lái)源的大量短小的任務(wù)据块。構(gòu)建服務(wù)器應(yīng)用程序的一個(gè)過(guò)于簡(jiǎn)單的模型是:每當(dāng)一個(gè)請(qǐng)求到達(dá)就創(chuàng)建一個(gè)新的服務(wù)對(duì)象码邻,然后在新的服務(wù)對(duì)象中為請(qǐng)求服務(wù)。但當(dāng)有大量請(qǐng)求并發(fā)訪(fǎng)問(wèn)時(shí)另假,服務(wù)器不斷的創(chuàng)建和銷(xiāo)毀對(duì)象的開(kāi)銷(xiāo)很大冒滩。所以提高服務(wù)器效率的一個(gè)手段就是盡可能減少創(chuàng)建和銷(xiāo)毀對(duì)象的次數(shù),特別是一些很耗資源的對(duì)象創(chuàng)建和銷(xiāo)毀浪谴,這樣就引入了“池”的概念开睡,“池”的概念使得人們可以定制一定量的資源因苹,然后對(duì)這些資源進(jìn)行復(fù)用,而不是頻繁的創(chuàng)建和銷(xiāo)毀篇恒。

線(xiàn)程池是預(yù)先創(chuàng)建線(xiàn)程的一種技術(shù)扶檐。線(xiàn)程池在還沒(méi)有任務(wù)到來(lái)之前,創(chuàng)建一定數(shù)量的線(xiàn)程胁艰,放入空閑隊(duì)列中款筑。這些線(xiàn)程都是處于睡眠狀態(tài),即均為啟動(dòng)腾么,不消耗CPU奈梳,而只是占用較小的內(nèi)存空間。當(dāng)請(qǐng)求到來(lái)之后解虱,緩沖池給這次請(qǐng)求分配一個(gè)空閑線(xiàn)程攘须,把請(qǐng)求傳入此線(xiàn)程中運(yùn)行,進(jìn)行處理殴泰。當(dāng)預(yù)先創(chuàng)建的線(xiàn)程都處于運(yùn)行狀態(tài)于宙,即預(yù)制線(xiàn)程不夠,線(xiàn)程池可以自由創(chuàng)建一定數(shù)量的新線(xiàn)程悍汛,用于處理更多的請(qǐng)求捞魁。當(dāng)系統(tǒng)比較閑的時(shí)候,也可以通過(guò)移除一部分一直處于停用狀態(tài)的線(xiàn)程离咐。

線(xiàn)程池的注意事項(xiàng)

雖然線(xiàn)程池是構(gòu)建多線(xiàn)程應(yīng)用程序的強(qiáng)大機(jī)制谱俭,但使用它并不是沒(méi)有風(fēng)險(xiǎn)的。在使用線(xiàn)程池時(shí)需注意線(xiàn)程池大小與性能的關(guān)系宵蛀,注意并發(fā)風(fēng)險(xiǎn)旺上、死鎖、資源不足和線(xiàn)程泄漏等問(wèn)題糖埋。

(1)線(xiàn)程池大小。多線(xiàn)程應(yīng)用并非線(xiàn)程越多越好窃这,需要根據(jù)系統(tǒng)運(yùn)行的軟硬件環(huán)境以及應(yīng)用本身的特點(diǎn)決定線(xiàn)程池的大小瞳别。一般來(lái)說(shuō),如果代碼結(jié)構(gòu)合理的話(huà)杭攻,線(xiàn)程數(shù)目與CPU 數(shù)量相適合即可祟敛。如果線(xiàn)程運(yùn)行時(shí)可能出現(xiàn)阻塞現(xiàn)象,可相應(yīng)增加池的大姓捉狻馆铁;如有必要可采用自適應(yīng)算法來(lái)動(dòng)態(tài)調(diào)整線(xiàn)程池的大小,以提高CPU 的有效利用率和系統(tǒng)的整體性能锅睛。

(2)并發(fā)錯(cuò)誤埠巨。多線(xiàn)程應(yīng)用要特別注意并發(fā)錯(cuò)誤历谍,要從邏輯上保證程序的正確性,注意避免死鎖現(xiàn)象的發(fā)生辣垒。

(3)線(xiàn)程泄漏望侈。這是線(xiàn)程池應(yīng)用中一個(gè)嚴(yán)重的問(wèn)題,當(dāng)任務(wù)執(zhí)行完畢而線(xiàn)程沒(méi)能返回池中就會(huì)發(fā)生線(xiàn)程泄漏現(xiàn)象勋桶。

# coding: utf-8
# Author: WMX
# !/usr/bin/env python

from threading import Thread
from Queue import Queue
from bs4 import BeautifulSoup
import signal
import sys
import urllib2
import ssl
if hasattr(ssl, '_create_unverified_context'):
    ssl._create_default_https_context = ssl._create_unverified_context


def get_title(ip):
    try:
        ip = ip.strip("\r\n")
        print ip
        req = urllib2.Request("http://" + ip)
        resp = urllib2.urlopen(req, data=None, timeout=3)
        respHtml = resp.read()
        soup = BeautifulSoup(respHtml, 'lxml')
        tables = soup.findAll('title')
        print tables
        ret = open("ret.txt", "a")  # save ret
        ret.write(ip + "        " + str(tables) + "\n")
        ret.close()
    except Exception as e:
        ret = open("ret.txt", "a")  # save ret
        ret.write(ip + "        " + str(e) + "\n")
        ret.close()
        print e


class Worker(Thread):
    def __init__(self, taskQueue):
        Thread.__init__(self)
        self.setDaemon(True)
        self.taskQueue = taskQueue
        self.start()

    def run(self):
        while 1:
            try:
                callable, args, kwds = self.taskQueue.get(block=False)
                self.taskQueue.get(block=False)
                print callable(*args, **kwds)
            except:
                break


class ThreadPool:
    def __init__(self):
        self.threads = []
        self.taskQueue = Queue()
        self.threadNum = num_thread
        self.__create_taskqueue()
        self.__create_threadpool(self.threadNum)

    def __create_taskqueue(self):
        f = open("d:\\port.txt", 'r') #要掃描的IP文件
        lines = f.readlines()
        for ip in lines:
            self.add_task(get_title, ip)

    def __create_threadpool(self, threadNum):
        for i in range(threadNum):
            thread = Worker(self.taskQueue)
            self.threads.append(thread)

    def add_task(self, callable, *args, **kwds):
        self.taskQueue.put((callable, args, kwds))

    def new_complete(self):
        for item in self.threads:
            if item.isAlive(): item.join()


def handler(signum, frame):
    global is_exit
    print "CTRL+C Is Pressed"
    sys.exit(0)


if __name__ == '__main__':
    num_thread = 20 #設(shè)置線(xiàn)程數(shù)
    signal.signal(signal.SIGINT, handler)
    signal.signal(signal.SIGTERM, handler)

    tp = ThreadPool()
    tp.new_complete()


參考:
http://blog.csdn.net/hzrandd/article/details/10074163

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脱衙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子例驹,更是在濱河造成了極大的恐慌捐韩,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹃锈,死亡現(xiàn)場(chǎng)離奇詭異荤胁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)仪召,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)寨蹋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扔茅,你說(shuō)我怎么就攤上這事已旧。” “怎么了召娜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵运褪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我玖瘸,道長(zhǎng)秸讹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任雅倒,我火速辦了婚禮璃诀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔑匣。我一直安慰自己劣欢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布裁良。 她就那樣靜靜地躺著凿将,像睡著了一般。 火紅的嫁衣襯著肌膚如雪价脾。 梳的紋絲不亂的頭發(fā)上牧抵,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音侨把,去河邊找鬼犀变。 笑死妹孙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弛作。 我是一名探鬼主播涕蜂,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼映琳!你這毒婦竟也來(lái)了机隙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤萨西,失蹤者是張志新(化名)和其女友劉穎有鹿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谎脯,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葱跋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了源梭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娱俺。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖废麻,靈堂內(nèi)的尸體忽然破棺而出荠卷,到底是詐尸還是另有隱情,我是刑警寧澤烛愧,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布油宜,位于F島的核電站,受9級(jí)特大地震影響怜姿,放射性物質(zhì)發(fā)生泄漏慎冤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一沧卢、第九天 我趴在偏房一處隱蔽的房頂上張望蚁堤。 院中可真熱鬧,春花似錦但狭、人聲如沸披诗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至搞莺,卻和暖如春息罗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背才沧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工迈喉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绍刮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓挨摸,卻偏偏與公主長(zhǎng)得像孩革,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子得运,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理膝蜈,服務(wù)發(fā)現(xiàn),斷路器熔掺,智...
    卡卡羅2017閱讀 134,699評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 從三月份找實(shí)習(xí)到現(xiàn)在饱搏,面了一些公司,掛了不少置逻,但最終還是拿到小米推沸、百度、阿里券坞、京東鬓催、新浪、CVTE恨锚、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,274評(píng)論 11 349
  • 前一陣的在思考為什么張小龍能夠做出來(lái)微信眠冈。 我覺(jué)得飞苇,除了騰訊內(nèi)部的架構(gòu)問(wèn)題,還有他個(gè)人的產(chǎn)品經(jīng)理的直覺(jué)蜗顽,或者可以說(shuō)...
    青空片想閱讀 468評(píng)論 0 1
  • 二布卡、懷念奶奶 我的奶奶是2011年7月28日去世的。 那天晚上12點(diǎn)多雇盖,我們都進(jìn)入了夢(mèng)鄉(xiāng)忿等,突然客廳的電話(huà)響了起來(lái),...
    西川紫閱讀 398評(píng)論 0 0