한땀한땀 정성들인 코딩

python 멀티 프로세싱과 비동기/동시성/병렬성 개념 정리 본문

언어/python

python 멀티 프로세싱과 비동기/동시성/병렬성 개념 정리

romance penguin 2018. 3. 29. 01:44
반응형

멀티 프로세싱 튜토리얼

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 함수는 비동기적으로 실행 완료된다.

반응형