파이썬 multiprocessing 모듈의 무한 루프를 돌고 있는 자식 프로세스 종료 방법

secretdog1의 이미지

안녕하세요? 파이썬을 이용하여 프로그램을 개발하고 있습니다.

GUI를 그리고 프로세스들을 관리하는 main.py 가 있고, controller 폴더에 ftp 서버 모듈, http 서버 모듈을 두고 import 하여 서버들을 돌리고 있습니다. 해당 모듈들은 각각 pyftpdlib, http.server 모듈입니다.

그런데 외부 모듈로 불러와서 프로세스를 생성하다 보니 서버 프로세스들과 메인 프로세스 간의 통신을 어떻게 해야 좋을지 모르겠습니다.

이 문제 가지고 3주정도 구글링을 해보았지만 다들 Ctrl+C 같은 걸로 중단할 때의 처리법만 나와있고 메인 코드에서 SIGTERM 같은 신호를 보내 종료하는 방법은 없는 것 같았습니다.

multiprocessing 모듈의 terminate() 메소드를 써 보았지만 이건 강제종료 기능인 것 같더라구요. 자식 프로세스에서 SIGTERM이나 SIGINT를 받지 못하고 강제종료가 되어버립니다.

----------
질문내용은 다음과 같습니다.

1. multiprocessing 모듈의 Process 메소드로 외부 모듈의 서버 프로세스를 만들었을 때, 자식 서버 프로세스와 메인 프로세스 간의 통신은 어떻게 해야 하나요? 자식 프로세스는 무한루프를 돌고 있는 상황입니다.

2. 메인 프로세스에서 무한루프를 돌고 있는 자식 프로세스 코드에 있는 종료 함수를 호출하여 제대로 종료시키려면 어떤 방법을 써야 하나요?

고수분들의 답변 기다리고 있겠습니다. 감사합니다.

goforit의 이미지

예제가 많은 링크를 하나 걸어봅니다.

https://pymotw.com/2/multiprocessing/communication.html

저 같은 경우는 multiprocessing.Manager().dict() 사용해서 문제를 해결했던 기억이 있습니다.

secretdog1의 이미지

참고해 보겠습니다. 감사합니다!

secretdog1의 이미지

해결했습니다!

서버가 동작되는 클래스를 스레드로 변경해서 하니 외부에서도 스레드 클래스 내부의 함수 접근이 가능했습니다.

import threading

class ServerThread(threading.Thread)
def __init__(self):
threading.Thread.__init__(self)

def run(self, *args, **kwargs):
# 서버 변수 선언 및 서버 실행 코드 입력

# 외부에서 사용하고자 하는 함수 선언
# 아래 코드는 예를 든 것임
def stop_server(self):
self.server_obj.close()

이런 식으로 서버 모듈을 작성하고 저장한 뒤에, 메인 모듈에서 import 하여 서버 객체를 생성하고 start() 메소드를 호출하면 스레드로 서버가 돌아갑니다.

한가지 주의할 점은 start() 메소드를 호출해야 하는 건데요, 스레드 클래스 내부에서는 run() 메소드를 정의했지만 외부에서 스레드를 시작할 때는 start() 메소드를 불러야 합니다.

이렇게 구현하면 제가 원했던 대로 백그라운드에서 서버가 돌아가고, 원할 때 종료할 수 있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.