상세 컨텐츠

본문 제목

코루틴 (Coroutine) (2) - 병행성과 Generator

개발/python-병렬처리

by Matthew0633 2022. 5. 11. 15:56

본문

병행성과 병렬성

병행성(Concurrency) : 한 컴퓨터가 여러 일을 동시에 수행 → 단일 프로그램안에서 여러일을 쉽게 해결 (멀티태스킹)

병렬성(Parallelism) : 여러 컴퓨터가 여러 작업을 동시에 수행

Generator란

Generator 는 yield를 통해 메인루틴에 값을 반환하는 것으로 사용될 수 있기 때문에 병행성을 구현할 때 활용이 될 수 있다.

Generator 를 정의할 수 있는 방법은 두가지 방식이 있는데, 하나는 함수와 yield를 사용하는 방법이고, 하나는 소괄호 내에 Comprehension 으로 정의하는 방식이다 (Generator Expression 이라고 불리며, Tuple 타입과는 아무 연관성이 없다)

# Generator 정의 방법 1
def generator_num():
    print('Start')
    yield 'first'
    print('continue')
    yield 'second'
    print('End')

# Generator 정의 방법 2
generator_num = (word for word in ['first', 'second'])

Python에 기본적으로 내장되어 있는 유용한 Generator 함수들

import itertools

# 수를 생성하는 count : 1부터 2.5씩 증가하는 수를 무한대로 return
gen1 = itertools.count(1, 2.5)

print(next(gen1))

# 조건을 정의하는 takewhile : 1부터 2.5씩 증가하는 수를 1000 미만까지 return
gen2 = itertools.takewhile(lambda n : n < 1000, itertools.count(1, 2.5))

# 반대필터
gen3 = itertools.filterfalse(lambda n : n < 3, [1,2,3,4,5])

for v in gen3:
    print(v)

# 누적합
gen4 = itertools.accumulate([x for x in range(1, 101)])

for v in gen4:
    print(v)

# 연결
gen5_1 = itertools.chain('ABCDE', range(1,11,2)) 
print(list(gen5_1)) # ['A', 'B', 'C', 'D', 'E', 1, 3, 5, 7, 9]

gen5_2 = itertools.chain(enumerate('ABCDE'))    
print(list(gen5_2 ))  # [(0, 'A'), (1, 'B'), (2, 'C'), (3, 'D'), (4, 'E')]]

# 개별
gen6_1 = itertools.product('ABCDE')
print(list(gen6_1)) # [('A',), ('B',), ('C',), ('D',), ('E',)]

# 순열(repeat 개)
gen6_2 = itertools.product('AB', repeat=2) 
print(list(gen6_2)) # [('A', 'A'), ('A', 'B'), ('B', 'A'), ('B', 'B')]

# 그룹화
gen7 = itertools.groupby('AAABBCCCCDDEEE')

for char, group in gen7:
    print(char, ' : ', list(group))

"""
A  :  ['A', 'A', 'A']
B  :  ['B', 'B']
C  :  ['C', 'C', 'C', 'C']
D  :  ['D', 'D']
E  :  ['E', 'E', 'E']
"""

관련글 더보기

댓글 영역