여니의 프로그래밍 study/파이썬

[파이썬 15장] 프로세스와 동시성, 비동기

여니's 2021. 1. 18. 13:30

참고 문헌

>> 처음 시작하는 파이썬


15장 포인트 : 한 컴퓨터에서 순차 및 동시 접근

 

## 프로그램과 프로세스

 

하나의 프로그램을 실행할 때 운영체제는 하나의 프로세스를 생성하는 데, 

한 프로세스는 다른 프로세스로부터 독립된 존재다.

 

os

>> 모듈에서 시스템 정보를 접근하는 몇 가지 함수를 제공한다.

더보기

os.getuid() 

>> 사용자 id

 

os.getgid()

>> 그룹id (프로세스 id)

 

os.getcwd()

>> 현재 작업 디렉터리


비동기 프로그래밍은

대기 시간을 낭비하지 않고

그 시간에 CPU가 다른 처리를 할 수 있도록 하는데

이를 흔히 non-blocking하다고 한다.

 

## 프로세스 생성하기 (1) : subprocess

>> subprocess 모듈로 존재하는 다른 프로그램을 시작하거나 멈출 수 있다.

더보기

import subprocess

ret=subprocess.getoutput('date')

ret

 


## 프로세스 생성하기(2) : multiprocessing

>> 프로그램의 전반적인 시간을 줄이기 위해 하나의 작업을 여러 프로세스에 할당할 수 있다.

multiprocessing 모듈은 프로세스 간의 상호통신과

모든 프로세스가 끝날 때까지 기다리는 큐작업을 포함한다.

 


## 프로세스 죽이기 : terminate()

 

>> 자세한 건 help(Process)

 


동기

: 부모 기러기 뒤에 새끼 기러기가 한 줄로 지어다니는 것처럼, 한 작업은 다른 작업을 따른다.

 

비동기

: 연못에서 거위들이 여기 저기 돌아다니는 것 처럼 작업은 독립적이다.

 


일반적으로 큐는 메세지를 전달한다.

분산 작업 관리를 위한 큐는 작업큐 (job queue, task queue)라고 한다.

 

I/O 바운드 문제 시 스레드 사용하기

CPU 바운드 문제 시 프로세스, 네트워킹, 이벤트 사용하기

 


## asyncio

async 및 await 문을 사용해서 비동기 코드를 정의한다.

더보기

RuntimeError: asyncio.run() cannot be called from a running event loop

> 오류

 

asyncio.run(wicked())은 python 3.7이후 버전에서 사용해야 한다.

주피터 노트북에서 사용중일땐

await wicked() 이라고 입력해야 한다.

 

 

====================================

 

## 코드 실행시간 체크하기 (timeit 모듈)

timeit(stmt='pass', setup='pass', timer=<built-in function perf_counter>, number=1000000, globals=None)

stmt : 실행 측정할 코드나 함수

setup : stmt를 실행하기 위해 사전에 필요한 코드나 함수를 선언

timer= Timer 인스턴스

number = 선언한 stmt의 수행 횟수

globals : 코드를 실행할 이름 공간을 지정한다. 

 

 

globals()를 globals 매개 변수로 전달해서 현재 전역 이름 공간에서 코드가 실행되도록 하는 것

>> globals()는 내장함수로 글로벌 심볼 테이블을 딕셔너리 형태로 돌려준다. 

이것은 항상 현재 모듈의 딕셔너리이다. 

docs.python.org/ko/3.6/library/functions.html#globals

 

2. 내장 함수 — Python 3.6.12 문서

2. 내장 함수 파이썬 인터프리터에는 항상 사용할 수 있는 많은 함수와 형이 내장되어 있습니다. 여기에서 알파벳 순으로 나열합니다. abs(x) 숫자의 절댓값을 돌려줍니다. 인자는 정수 또는 실수

docs.python.org

timeit(함수명,number=함수호출수)

ex) timeit(hello,number=1)

 

 


 

동기식 코드와 비동기식 코드는 공존할 수 있다. 동일한 프로그램 내에

def앞에 async를 입력하고 비동기 함수가 호출되기 전에 await을 입력한다.

 

asyncio.sleep(2) 호출 자체는 코루틴으로,

API 호출처럼 시간이 많이 걸리는 곳에서 사용한다. 

 

asyncio 웹 크롤러 코드

www.aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html

 

500 Lines or Less | A Web Crawler With asyncio Coroutines

A. Jesse Jiryu Davis is a staff engineer at MongoDB in New York. He wrote Motor, the async MongoDB Python driver, and he is the lead developer of the MongoDB C Driver and a member of the PyMongo team. He contributes to asyncio and Tornado. He writes at htt

www.aosabook.org