2017-11-21 10 views
0

python3 (iperf3)과 함께 사용해야하는 라이브러리 중 하나는 'run'라이브러리가 기본 스레드에서 실행 된 이어야한다는 것입니다.멀티 프로세스를 사용하는 새로운 프로세스가 메인 스레드에서 실행될 수 있습니까?

나는 멀티 프로세싱 라이브러리와 새로운 프로세스 나 프로세스의 메인 쓰레드를 사용하게됩니다 있는지 확인하기 위해 몇 가지 검사를 수행하고있어하지만 조각과 나는 새로운 '메인 스레드'에 대한 가질 수 없습니다 위 보인다 과정.

분기 프로세스를 새 프로세스의 주 스레드로 실행하는 권장 방법은 무엇입니까? 그게 가능하니? Celery와 같은 시스템이 이것을 도와 줄 것입니까? 나는 이것을 플라스크 (Flask) 응용 프로그램에서 실행할 계획입니다.

감사합니다.

#! /usr/bin/python3 

import threading 
import multiprocessing as mp 


def mp_call(): 
    try: 
     print("mp_call is mainthread? {}".format(isinstance(threading.current_thread(), threading._MainThread))) 
    except Exception as e: 
     print('create iperf e:{}'.format(e)) 


def thread_call(): 
    try: 
     print("thread_call is mainthread? {}".format(isinstance(threading.current_thread(), threading._MainThread))) 
     p = mp.Process(target=mp_call, args=[]) 
     p.daemon = False 
     p.start() 
     p.join() 
     print('Process ended') 
    except Exception as e: 
     print('thread e:{}'.format(e)) 

t = threading.Thread(target=thread_call) 
t.daemon = False 
t.start() 
t.join() 
print('Thread ended') 
+0

플라스크 응용 프로그램에서 다중 처리를 사용하지 마십시오. WSGI 서버로 인해 모든 종류의 문제가 발생합니다. 서버에는 자체 프로세스 및 스레딩 시스템이 있습니다. –

+0

@KlausD. 무엇을 사용 하시겠습니까? 셀러리? – h3ct0r

+0

@georgexsh, 지금은 iperf3 모듈을 약간 수정했고 셀러리를 내 프로젝트에 통합하여 이러한 작업을 실행하고 모든 것이 실행될 때보고합니다! – h3ct0r

답변

1

는 사실, 모든 스레드가 포크 후 죽은, 당신이 당신의 현재의 thread로하는 새로운 "기본"스레드를 얻을 것이다, 당신의 검사 방법은 잘못된 것입니다. threading._MainThread 공개 API를하지 않습니다, 대신 threading.main_thread()을 사용하지 :

assert threading.current_thread() == threading.main_thread() 

main thread got replaced 때문에 서브 프로세스 포크 후, 더 이상 _MainThread 서브 클래스를.