작성
·
368
0
강사님 안녕하세요. 강의에서 말씀해주셨던 Manager 방식이 아닌 Array로 공유리스트 변수 생성하는 방법에 대해 질문드립니다.
1) Array("i", range(5)) 과 같은 형태로 생성한 공유 리스트 변수에 append하는 방법이 궁금합니다.
아래 코드로 실행하면
:AttributeError: 'SynchronizedArray' object has no attribute 'append'
에러가 발생합니다.
2) 변수 생성 시점에서 range( )의 값은 몇으로 정의하든 상관이 없나요? 지금은 예시로 range(5)로 했지만 리스트 안에 값이 얼마나 글어갈지 모르는 상황이라면 어떻게 정의해주어야 하는지 알 고 싶습니다.
아래 코드 전달드립니다. 감사합니다.
from multiprocessing import current_process, Process, Array, Manager, freeze_support
import time
import os
def cpu_bound(number, total_lst):
process_id = os.getpid()
process_name = current_process().name
print(f"Process ID : {process_id}, Prcoess Name : {process_name}")
total_lst.append(sum(i*i for i in range(number)))
def main():
numbers = [3_000_000 + x for x in range(10)]
# 프로세스 리스트 선언
processes = list()
# 프로세스 공유 매니저
manager = Manager()
# 리스트 획(프로세스 공유)
#total_list = manager.list()
total_list = Array("i",range(5))
# 프로세스 생성 및 실행
for i, num in enumerate(numbers):
p1 = Process(name=str(i), target=cpu_bound, args=(num, total_list,))
# 배열에 담
processes.append(p1)
p1.start()
# Join
for process in processes:
process.join( )
start_time = time.time()
print(f"total list = {total_list}")
print(f"Sum = {sum(total_list)}")
duration = time.time()-start_time
print(f"Duratrion = {duration} sec")
if __name__=="__main__":
main( )
답변 1
0
안녕하세요.
(1). https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Array
읽어보시고 기본 값으로 정의 후 사용합니다. 일반적인 array와 달리 범위를 픽스해서 사용하는 것을
추천드립니다.
(2)번 항목은 파이썬 정수 범위 한계 안에서 정의 가능합니다. 주로 나중에 Generator를 사용하게 됩니다.