スレッド、スレッドプール

3059 ワード

スレッドとは
スレッドはCPU実行の基本ユニットであり、スレッドの実行は無秩序であり、同一プロセス下のスレッド間のリソース共有であり、スレッドはI/O密集型タスクを格納するために使用されることが多い
GIL:
グローバル・インタプリタ・ロックCPythonインタプリタは、GILグローバル・インタプリタ・ロックが存在するため、同一時刻に1つのスレッドのみが実行されることを保証するので、シングルコア実行に相当し、スレッドはCPUリソースを十分に利用できない
使用
  • モジュールimport threading
  • を使用
  • threading.Thread()——target:スレッドが実行するターゲット関数——name:スレッド名——args:伝達パラメータ(メタグループ)——kwargs:伝達パラメータ(辞書)——daemon:デフォルトはFalse、メインスレッドが終了し、サブスレッドの実行に影響しない——daemon:Trueと黙認し、メインスレッドが終了し、サブスレッドは
  • を終了する
    スレッド
    import threading
    data = []
    
    def run1(num,**kwargs):
        global data
        print(kwargs)
        lock.acquire()  #   
        for i in range(num):
            #threading.currentThread().name:           
            print(i,threading.currentThread().name)
            # data.append(i)
            sum += 1
        lock.release()  #   
    
    
    def run2(num):
        global data
        lock.acquire()
        for i in range(num):
            #threading.currentThread().name:           
            print(i,threading.currentThread().name)
            # data.append(i)
            sum += 1
        lock.release()
    
    
    if __name__ == '__main__':
        print('begin',threading.currentThread().name)
        #    
        lock = threading.Lock()
      
        thread1 = threading.Thread(target=run1,name='  1',args=(10000,),kwargs={'name':'  '},daemon=True)
        thread2 = threading.Thread(target=run1,name='  2',args=(10000,),daemon=True)
    
        thread1.start()
        thread2.start()
    
        #join(),     (  ),            ,         
        # thread1.join()
        # thread2.join()
    
        print(data,sum)
        print('over', threading.currentThread().name)
    
    
    
    スレッドプール
    マルチタスクに設計されている場合、タスクを実行するために多くのスレッドが必要になります.これは、手動でスレッドを作成するのが不便な場合、スレッドプールを使用することができます.
    #     ,    ,                  
    
    from concurrent.futures import ThreadPoolExecutor
    import requests
    
    def download(url,filename,kwargs):
        print(kwargs)
        headers = {
             'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
         }
        response = requests.get(url=url, headers=headers)
            if response.status_code == 200:
            return response.text,filename
    
    def done(future):
         # print(future.result())
         text = future.result()[0]
         filename = future.result()[1]
         print(filename)
         with open(filename,'w') as file:
             file.write(text)
    
     if __name__ == '__main__':
         import threading
         print('start',threading.currentThread().name)
    
         task = []
         for i in range(10):
             url = 'https://www.baidu.com/?kw='+str(i)
             task.append(url)
         #     
         pool = ThreadPoolExecutor(max_workers=10)
    
         for index,url in enumerate(task):
             print(index,url)
             result = pool.submit(download,url,str(index)+'.html',kwargs={'name':'123'})
            result.add_done_callback(done)
    
        #shutdown:             join()  
         pool.shutdown(wait=True)
    
         print('end', threading.currentThread().name)