マルチタスク処理
17741 ワード
今日は同期性、並列性を学びました.
以前学んだことがあり、以前整理したものをリンクし直します.
同期vsパラレル同期:同時実行のように見える 並列性:実際には複数のタスクを同時に処理 コメントリンク 同期vs非同期モチベーション:タスクを別のスレッドに入れて待機します. 非同期:次のタスクの実行を待たずに別のスレッドにタスクを配置します. コメントリンク I/O Bound vs CPU BoundI/Oフラクチャ:データ(ファイル)の入出力処理に時間がかかります. CPUバインド:大量の計算(複雑な数式計算やグラフィック処理など)が必要です. プロセスとスレッドプロセス:オペレーティングシステムからリソースを割り当てるオペレーティングユニット、実行中のプログラム スレッド:プロセスが指定したリソースを使用する実行単位 コメントリンク プロファイルprofiling:アプリケーション内のリソースが最も集中している場所を特定するためのテクノロジー Profiler:アプリケーションの実行と各関数の実行に要する時間を検索するプログラム モジュール:profile、cProfile、line profiler Scale Up vs Scale OutScale-Up:コンピュータのパフォーマンスを最適化する方法 Scale-Out:複数のコンピュータを1台のコンピュータとして使用 コメントリンク 実装-マルチスレッド
https://velog.io/@nameunzz/thread-threading
スレッドプールを作成すると、タスクごとにスレッドが自動的に割り当てられ、終了します.
プールの作成方法Queueリソース構造 concurrent.FuturesライブラリのThreadPollExector、ProcessPollExectorクラス を使用
concurrent.futures
concurrent.先物公式文書Executorオブジェクト Futureオブジェクト ThreadPoolExecutorオブジェクト multiprocessing.Pool.mapにより特定の関数を複数のプロセスにマッピングして並列処理 ProcessPoolExecutorオブジェクト
以前学んだことがあり、以前整理したものをリンクし直します.
同期vsパラレル
https://velog.io/@nameunzz/thread-threading
from threading import *
from time import sleep
Stopped = False
def worker(work, sleep_sec): # 일꾼 스레드입니다.
while not Stopped: # 그만 하라고 할때까지
print('do ', work) # 시키는 일을 하고
sleep(sleep_sec) # 잠깐 쉽니다.
print('retired..') # 언젠가 이 굴레를 벗어나면, 은퇴할 때가 오겠지요?
t = Thread(target=worker, args=('Overwork', 3)) # 일꾼 스레드를 하나 생성합니다. 열심히 일하고 3초간 쉽니다.
t.start() # 일꾼, 이제 일을 해야지?
# 이 코드 블럭을 실행하기 전까지는 일꾼 스레드는 종료하지 않습니다.
Stopped = True # 일꾼 일 그만하라고 세팅해 줍시다.
t.join() # 일꾼 스레드가 종료할때까지 기다립니다.
print('worker is gone.')
インプリメンテーション-マルチプロセスimport multiprocessing as mp
def delivery():
print('delivering...')
p = mp.Process(target=delivery, args=())
p.start()
p = mp.Process(target=delivery, args=())
p.start() # 프로세스 시작
p.join() # 실제 종료까지 기다림 (필요시에만 사용)
p.terminate() # 프로세스 종료
スレッドプール、プロセスプールスレッドプールを作成すると、タスクごとにスレッドが自動的に割り当てられ、終了します.
プールの作成方法
concurrent.futures
concurrent.先物公式文書
from concurrent.futures import ThreadPoolExecutor
class Delivery:
def run(self):
print("delivering")
w = Delivery()
with ThreadPoolExecutor() as executor:
future = executor.submit(w.run)
# multiprocessing.Pool
from multiprocessing import Pool
from os import getpid
def double(i):
print("I'm process ", getpid()) # pool안에서 이 메소드가 실행될 때 pid확인
return i * 2
with Pool() as pool:
result = pool.map(double, [1, 2, 3, 4, 5])
print(result)
import math, time
import concurrent
PRIMES = [
112272535095293,
112582705942171,
112272535095293,
115280095190773,
115797848077099,
1099726899285419]
def is_prime(n):
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False
sqrt_n = int(math.floor(math.sqrt(n)))
for i in range(3, sqrt_n + 1, 2):
if n % i == 0:
return False
return True
def main():
print("병렬처리 시작")
start = time.time()
with concurrent.futures.ProcessPoolExecutor() as executor:
for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
print('%d is prime: %s' % (number, prime))
end = time.time()
print("병렬처리 수행 시각", end-start, 's')
start = time.time()
for number, prime in zip(PRIMES, map(is_prime, PRIMES)):
print('%d is prime: %s' % (number, prime))
end = time.time()
print("단일처리 수행 시각", end-start, 's')
main()
병렬처리 시작
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False
병렬처리 수행 시각 0.39751267433166504 s
112272535095293 is prime: True
112582705942171 is prime: True
112272535095293 is prime: True
115280095190773 is prime: True
115797848077099 is prime: True
1099726899285419 is prime: False
단일처리 수행 시각 1.9754359722137451 s
Reference
この問題について(マルチタスク処理), 我々は、より多くの情報をここで見つけました https://velog.io/@nameunzz/multitaskingテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol