【Python 3.6爬虫学習記録】(十四)マルチスレッド爬虫テンプレートまとめ

10137 ワード

前言:ここ数日忙しくてホームページを作って游んで、ネット上にも教程がありません.ドメイン名を買うのは解析しなければならないし、登録しなければならないし、本当に面倒で、簡単なHTMLページではそんなに面倒ではないと思います.昨日またいくつかのマルチスレッド爬虫類の例を見て、とても良いと思って、精錬して、いくつかの応用テンプレートをまとめました.
目次
  • ディレクトリ
  • マルチスレッドThreadingモジュール
  • 1-1簡単な関数はマルチスレッド
  • を作成します.
  • 2-1クラスパッケージスレッドオブジェクト
  • 二マルチスレッドQueueモジュール
  • 2-1 QueueとThreadingモジュール
  • を使用
  • 三多プロセス同時モジュール
  • 3-1 QueueとThreadingの同時実行
  • 3-2 multiprocessingモジュール同時
  • を実現



    マルチスレッドThreadingモジュール
    1-1単純な関数マルチスレッドの作成
    ##     thread  
    import socket
    import threading
    import requests
    
    tasks = []
    lock = threading.Lock()  #      
    
    #       
    def worker(i):
        socket.setdefaulttimeout(5)  #         
    
        try:
            r = requests.get(url)
            lock.acquire()  #    
            print('Processing ',i)
            lock.release()  #    
    
        except Exception as e:
            lock.acquire()
            print(e)
            lock.release()
    
    #    
    threads = []
    for i in range(len(tasks)):
        #     ,    ,        
        thread = threading.Thread(target=worker, args=[i])
        #    IP    ,      
        threads.append(thread)
        thread.start()
    
    #      ,         
    #     ,             
    for thread in threads:
        thread.join()

    2-1クラス包装スレッドオブジェクト
    import threading
    import time
    
    class myThread(threading.Thread):
        '''
            
        '''
        def __init__(self, threadID, name, counter):
            threading.Thread.__init__(self)
            self.threadID = threadID
            self.name = name
            self.counter = counter
    
        def run(self):
            print("Starting " + self.name)
            '''           
            '''
            #    ,         True
            #    timeout                
            #         False
            threadLock.acquire()
    
            '''    ,    
            '''
    
            print(self.name, self.counter, 3)
    
            #    
            threadLock.release()
    
    threadLock = threading.Lock()
    threads = []
    
    '''  ,  ,     
    '''
    for i in range(1,3):
        #      
        thread = myThread(i, "Thread-%s"%i, i)
        #      
        thread.start()
        #          
        threads.append(thread)
    
    #         
    for t in threads:
        t.join()
    
    print("iting Main Thread")

    デュアルスレッドQueueモジュール
    2-1 QueueとThreadingモジュールの使用
    import os
    import random
    import threading
    import time
    from queue import Queue
    import requests
    
    class myThread(threading.Thread):
        def __init__(self,func):
            #         
            super(myThread, self).__init__()
            #         
            self.func=func
        def run(self):
            '''
               run  
            '''
            self.func()
    
    #     
    def worker():
        global Q
        while not Q.empty():
            #     
            item = Q.get()
            '''
                 
            '''
            #    Queue,     
            Q.task_done()
    
    '''       
    '''
    
    #    
    def main():
        global Q
        threads = []
        #         
        for task in range(len(tasks)):
            Q.put(tasks[task])
        #     
        for i in range(thread_num):
            thread = myThread(worker)
            thread.start()
            threads.append(thread)
        #       
        for thread in threads :
            thread.join()
        #         
        Q.join()
    #       
    if __name__ == '__main__':
        #      
        Q = Queue()
        #    
        thread_num = 100
        #       
        tasks = []
        start = time.time()
        main()
        end = time.time()
        print('It takes ',end-start)
    
    

    トリプルプロセス同時モジュール
    3-1 QueueとThreadingの同時実行
    #        
    from queue import Queue
    from threading import Thread
    from time import sleep
    #q     
    #NUM       
    #JOBS      
    q = Queue()
    NUM = 2
    JOBS = 10
    
    #       ,        
    def do_somthing_using(arguments):
        print(arguments)
    
    #       ,             
    def working():
        while True:
            arguments = q.get()
            do_somthing_using(arguments)
            sleep(1)
            q.task_done()
    
    #fork NUM       
    for i in range(NUM):
        t = Thread(target=working)
        t.setDaemon(True)
        t.start()
    
    # JOBS    
    for i in range(JOBS):
        q.put(i)
    
    #    JOBS  
    q.join()

    3-2 multiprocessingモジュール同時実行
    from multiprocessing import Pool
    pool = Pool(8)
    data_list = pool.map(get, url_list)
    pool.close()
    pool.join()

    後記:理解していないものもありますが、テンプレートを直接セットすることができます.簡単に簡単に言えば、クラスでThreadingモジュールを包装することができますが、もしアプリケーションの対象が多いならば、このように一気にすべてのスレッドを開いて、詰まって死んで、解決方法があるでしょう.まだ調べていません.そして、タスクオブジェクトが多い場合は、queueモジュールを直接使用して、一定のスレッドだけを開いて、順番に実行します.現在のアプリケーションはいいですね.最後に、マルチプロセスの同時性についてはまだよく分からないので、後で理解しましょう.その間に協程も見て、知識が足りなくなってから勉強します.
    参考リンク:Python爬虫類進級5のマルチスレッドの使い方Python爬虫類(5)–マルチスレッド続(Queue)Python爬虫類インスタンス2-マルチスレッド爬虫類抓取不祥事百科データPython爬虫類(4)–マルチスレッド