• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

Array로 공유 리스트 변수 생성방법 질문

22.05.26 17:17 작성 조회수 300

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를 사용하게 됩니다.