スレッド、スレッドプール
3059 ワード
スレッドとは
スレッドはCPU実行の基本ユニットであり、スレッドの実行は無秩序であり、同一プロセス下のスレッド間のリソース共有であり、スレッドはI/O密集型タスクを格納するために使用されることが多い
GIL:
グローバル・インタプリタ・ロックCPythonインタプリタは、GILグローバル・インタプリタ・ロックが存在するため、同一時刻に1つのスレッドのみが実行されることを保証するので、シングルコア実行に相当し、スレッドはCPUリソースを十分に利用できない
使用モジュールimport threading を使用 threading.Thread()——target:スレッドが実行するターゲット関数——name:スレッド名——args:伝達パラメータ(メタグループ)——kwargs:伝達パラメータ(辞書)——daemon:デフォルトはFalse、メインスレッドが終了し、サブスレッドの実行に影響しない——daemon:Trueと黙認し、メインスレッドが終了し、サブスレッドは を終了する
スレッド
マルチタスクに設計されている場合、タスクを実行するために多くのスレッドが必要になります.これは、手動でスレッドを作成するのが不便な場合、スレッドプールを使用することができます.
スレッドはCPU実行の基本ユニットであり、スレッドの実行は無秩序であり、同一プロセス下のスレッド間のリソース共有であり、スレッドはI/O密集型タスクを格納するために使用されることが多い
GIL:
グローバル・インタプリタ・ロックCPythonインタプリタは、GILグローバル・インタプリタ・ロックが存在するため、同一時刻に1つのスレッドのみが実行されることを保証するので、シングルコア実行に相当し、スレッドはCPUリソースを十分に利用できない
使用
スレッド
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)