한땀한땀 정성들인 코딩
python 멀티 프로세싱과 비동기/동시성/병렬성 개념 정리 본문
반응형
멀티 프로세싱 튜토리얼
import os
from multiprocessing import Process
import time, random
def doubler(number):
result = number * 2
proc = os.getpid()
time.sleep(random.randrange(1,20))
print('{0} re:{1} id:{2}'.format(number, result, proc))
if __name__ == '__main__':
numbers = [5,10,15,20,25]
procs = []
for index, number in enumerate(numbers):
proc = Process(target=doubler, args=(number,))
procs.append(proc)
proc.start()
for proc in procs:
proc.join()
- numbers만큼 doubler 함수를 작동시키는 프로세스가 실행된다.
멀티 프로세싱 자원공유 튜토리얼
from multiprocessing import Process, Queue
sentinel = -1
def creator(data, q):
print("create data")
for item in data:
q.put(item)
def my_consumer(q):
while True:
data = q.get()
processed = data * 2
print(processed)
if data is sentinel:
break
if __name__ == '__main__':
q = Queue()
data = [5, 10, 13, -1]
procs = []
process_one = Process(target=creator, args =(data,q))
process_two = Process(target=my_consumer, args =(q,))
procs.append(process_one)
procs.append(process_two)
process_one.start()
process_two.start()
for proc in procs:
proc.join()
-Quere() 객체를 두개의 프로세스가 공유한다.
##개념 정리
동시성(Concurrency) vs 병렬성(Parallelism)
동시성 : 싱글 코어에서 여러 개의 스레드가 번갈아가면서 실행 -동시에 실행되는 것 처럼 보임
병렬성 : 멀티코어에서 멀티 스레드 동작
비동기 프로그래밍 vs 멀티 프로세싱
둘다 효율적인 cpu사용을 위해 사용하는 방식이다. (node.js vs apache 라고 볼 수도 있을듯..)
비동기 프로그래밍(동시성) : 작업과 I/O를 병렬 처리, syscall이 없으면 사실상 불 필요
멀티 프로세싱 : context 스위칭 자주 발생, 하나의 스레드에 대해서 효율적인 작업
*요점은 비동기 프로그래밍은 중간에 하던 작업을 중단시키고 다른 작업을 수행할 수 있다는 것 이다.
(*문맥 교환 없이, 유저영역에서 처리 하는 것)
python 비동기 프로그래밍
import asyncio
import random
async def lazy_greet(msg, delay=1):
print(msg, "will be displayed in", delay, "seconds")
await asyncio.sleep(delay)
return msg.upper()
async def main():
messages = ['hello', 'world', 'apple', 'banana', 'cherry']
fts = [asyncio.ensure_future(lazy_greet(m, random.randrange(1,5))) for m in messages]
for f in asyncio.as_completed(fts):
x = await f
print(x)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
- lazy_greet 함수는 비동기적으로 실행 완료된다.
반응형