python多線程和多進程(一)

來源:互聯網
上載者:User

標籤:javascrip   lock   asc   xsl   第一個   window   splay   html   closed   

一、多線程

  1. Python的標準庫提供了兩個模組:_threadthreading_thread是低級模組,threading是進階模組,對_thread進行了封裝。絕大多數情況下,只需要使用threading這個模組。  
    import threadingfrom time import ctime,sleep
    def func1(func): print u" 我是函數%s.此刻列印時間: %s" %(func,ctime()) sleep(5) print u‘%s再次列印時間%s‘ % (func,ctime())
    def func2(func): print u"我是函數 %s此刻列印時間: %s" %(func,ctime()) sleep(5) print u‘%s再次列印時間%s‘%(func,ctime())
    threads = []t1 = threading.Thread(target=func1,args=(‘func1‘,)) #建立線程,args傳參必須以元組方式傳入 threads.append(t1)t2 = threading.Thread(target=func2,args=(‘func2‘,))#建立線程,args傳參必須以元組方式傳入
    threads.append(t2)
    if __name__ == ‘__main__‘:
    for t in threads:
    # t.setDaemon(True) #設定守護線程(主線程退出,子線程也會退出,不會掛起佔用資源)
    t.start() #啟動線程
    print u‘指令碼結束時間%s‘%ctime()

     運行結果:(注意setDaemon())

    我是函數func1.此刻列印時間: Fri Sep 07 15:43:15 2018我是函數 func2此刻列印時間: Fri Sep 07 15:43:15 2018指令碼結束時間Fri Sep 07 15:43:15 2018  #(三個都是同一時間列印)

    func1再次列印時間Fri Sep 07 15:43:20 2018 func2再次列印時間Fri Sep 07 15:43:20 2018 #(兩個都為等待5秒後同事列印)

    說明;func1,func2都是同時一時間執行任務了,但是為什麼指令碼結束時間先列印了,原因是主線程被分成兩個子線程同時運行,但是子線程有等待5秒但主線程沒有等待就直接執行了列印了;

  2. 我們稍作改進:
    import threadingfrom time import ctime,sleepdef func1(func):    print u" 我是函數%s.此刻列印時間: %s" %(func,ctime())    sleep(5)    print u‘%s再次列印時間%s‘ % (func,ctime())def func2(func):    print u"我是函數 %s此刻列印時間: %s" %(func,ctime())    sleep(5)    print u‘%s再次列印時間%s‘%(func,ctime())threads = []t1 = threading.Thread(target=func1,args=(‘func1‘,))threads.append(t1)t2 = threading.Thread(target=func2,args=(‘func2‘,))threads.append(t2)if __name__ == ‘__main__‘:    for t in threads:        # t.setDaemon(True) #設定守護線程(主線程退出,子線程也會退出,不會掛起佔用資源)        t.start()    for t in threads:
    t.join() # 等待線程執行結束
    print u‘指令碼結束時間%s‘%ctime()
    我是函數func1.此刻列印時間: Fri Sep 07 16:09:29 2018我是函數 func2此刻列印時間: Fri Sep 07 16:09:29 2018func1再次列印時間Fri Sep 07 16:09:34 2018func2再次列印時間Fri Sep 07 16:09:34 2018指令碼結束時間Fri Sep 07 16:09:34 2018

      主線程執行到,然後等待子線程;

  3. 上個第一次使用線程寫東西的項目吧,去年剛開始寫爬蟲因為數量多所以網上到處找資料,東拼西湊總算給我搞出來了
    #encoding:utf-8import requestsimport threadingfrom lxml import etreeimport codecs,csvdef return_link():    Link = []    for  i in range(2000):        url="http://www.xzgsj.gov.cn/baweb/show/shiju/gg.jsp?fenceid=95000000&total=45192&queryType=6&pagenum="+str(i)+"&action=gg.jsp?ssid=ZxSlh1DBkGGpV2hnWMSt5PG7f8FPjTbvH78vJ1nFcwYyMhWzGBzy!1470507879!1500631589968&findWenhao=&findName="        Link.append(url)    return  Linkdef get_href():    while True:        lock.acquire()        if len(Link) == 0:            lock.release()            break        else:            url = Link.pop(0)            lock.release()            r = requests.get(url, headers=headers).content            print url            pages = etree.HTML(r.decode(‘utf-8‘))            a = pages.xpath(u"//table[@width=‘700‘]/tr[position()>1]/td/a/@onclick")            for i in a:                a = i.replace(‘javaScript:window.open(\‘‘, ‘‘).replace(‘\‘,\‘a\‘,\‘width=550 height=350\‘)‘, ‘‘)                url = ‘http://www.xzgsj.gov.cn/baweb/show/shiju/‘ + a                with codecs.open(‘url.csv‘,‘ab‘) as f:                    w = csv.writer(f)                    w.writerow([url])if __name__ == ‘__main__‘:    headers = {        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"    }    lock = threading.Lock()#線程鎖    Link = return_link()    tasks = []  # 工作清單    for x in range(5):        t = threading.Thread(target=get_href)  # 準備線程函數及參數        t.setDaemon(True)  # 設定守護線程(主線程退出,子線程也會退出,不會掛起佔用資源)        tasks.append(t)    for t in tasks:        t.start()  # 啟動多線程(工作清單有多少個值,就會啟動多少個線程)    for t in tasks:        t.join()  # 等待線程執行結束
    View Code
  4. 使用Threading模組建立線程,直接從threading.Thread繼承,然後重寫__init__方法和run方法:(和第一個例子一樣只是基於類的使用)
    import threadingfrom time import ctime,sleepclass myThread(threading.Thread):  # 繼承父類threading.Thread    def __init__(self, threadID, name, counter):        threading.Thread.__init__(self)        self.threadID = threadID        self.name = name        self.counter = counter    def run(self):  # 把要執行的代碼寫到run函數裡面 線程在建立後會直接運行run函數        print "Starting " + self.name,u‘時間{}‘.format(ctime())        sleep(5)        print "Exiting " + self.name,u‘時間{}‘.format(ctime())# 建立新線程thread1 = myThread(1, "Thread-1", 1)thread2 = myThread(2, "Thread-2", 2)# 開啟線程tasks = []tasks.append(thread1)tasks.append(thread2)if __name__ == ‘__main__‘:    for t in tasks:        # t.setDaemon(True) #設定守護線程(主線程退出,子線程也會退出,不會掛起佔用資源)        t.start()    for t in tasks:        t.join()  # 等待線程執行結束    print u‘指令碼結束時間%s‘%ctime()
    結果:
    Starting Thread-1 時間Fri Sep 07 17:13:53 2018Starting Thread-2 時間Fri Sep 07 17:13:53 2018
    Exiting Thread-1 時間Fri Sep 07 17:13:58 2018
    Exiting Thread-2 時間Fri Sep 07 17:13:58 2018
    指令碼結束時間Fri Sep 07 17:13:58 201

      

  5. 第一篇over,以後想到再加吧

python多線程和多進程(一)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.