멀티프로세싱 프로그램 실행시 수십개의 프로그램이 실행됩니다.

조회수 350회

먼저 만들고 있는 프로그램의 설명입니다.

  1. 유튜브 채팅창을 크롤링하여 그 정보를 큐에 넣어서 전달(멀티프로세스)
  2. 전달된 큐의 내용을 파이게임에서 받아서 이미지를 화면에 뿌림

아래는 작성한 코드입니다.

main.py--

import chat

import pygame

import random

import glob

import re

from multiprocessing import Process, Queue

if __name__ == "__main__":

    width = 1600
    height = 900
    imagesFolderPath = "./images"
    R = 0
    G = 255
    B = 0
    videoId = ""
    FPS = 60
    paidOutSpeed=5
    paidInSpeed=5

    # 설정파일 경로
    configFile = "./config.txt"

    pygame.init()

중략...

    config.close()

    q = Queue()
    q.put(overComment)

    #멀티 프로세스 실행
    th1 = Process(target=chat.fetch_comments, args=(q, videoId))
    th1.start()

    # 화면 크기 설정
    screen = pygame.display.set_mode((width, height))

    #파이게임 화면출력, 이미지 출력

 후략...



chat.py

import pytchat

def fetch_comments(chatImageNum, videoId):
    chat = pytchat.create(videoId)
    runningChat = True
    while True:
        for c in chat.get().sync_items():
            chatImageNum.put(c.message)

코드는 이상입니다. th1.start()가 움직일 때 if name == "main"를 계속 불러와서 새로운 프로세스가 만들어지고... 새로운 파이게임 스크린이 만들어집니다

VSCode로 실행할 때는 문제없이 실행이 됩니다만(프로세스가 새로 만들어지지 않음), pyinstaller로 실행파일을 만들어 실행하면 프로세스가 계속해서 만들어지는 문제가 있습니다

원인이나 수정방법을 알 수 있을까요?

1 답변

  • if name == "main": 코드블럭은 파이썬에서 스크립트가 실행되는 경우 해당 블록 내의 코드를 실행하도록 지시하는 코드입니다. 이는 모듈을 임포트할 때 해당 모듈의 코드가 실행되지 않도록 하는 것을 방지하기 위한 것입니다.

    따라서, main.py에서 if name == "main": 코드블럭을 사용하는 것은 해당 스크립트가 실행될 때만 th1.start()를 실행한다는 것을 보장합니다. 그러나 pyinstaller로 실행 파일을 만들 때, 이 if 블록이 올바르게 작동하지 않을 수 있습니다.

    따라서 main.py에서 if name == "main": 블록의 내용을 main() 함수 내부에 넣고, if name == "main": 아래에서 main() 함수를 호출하도록 변경하면 됩니다. 예를 들어:

    def main():
        width = 1600
        height = 900
        imagesFolderPath = "./images"
        R = 0
        G = 255
        B = 0
        videoId = ""
        FPS = 60
        paidOutSpeed=5
        paidInSpeed=5
    
        # 설정파일 경로
        configFile = "./config.txt"
    
        pygame.init()
    
        # ...
    
        config.close()
    
        q = Queue()
        q.put(overComment)
    
        #멀티 프로세스 실행
        th1 = Process(target=chat.fetch_comments, args=(q, videoId))
        th1.start()
    
        # 화면 크기 설정
        screen = pygame.display.set_mode((width, height))
    
        #파이게임 화면출력, 이미지 출력
        # ...
    
    
    if __name__ == "__main__":
        main()
    
    

    이렇게 수정하면 th1.start()가 if name == "main":에서만 실행되도록 보장할 수 있습니다.

    • 답변감사합니다! 하지만 th1(#파이게임 화면출력, 이미지 출력이후처리포함)이 무한히 실행되는 문제는 고쳐지지 않았습니다... 다른 방법을 찾아봐야겠네요... atjgmlckd 2023.2.19 02:35

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)