2017-11-29 1 views
0

스레드 모듈을 사용하여 파이썬에서 스레드를 중지하는 방법을 찾고 있었는데이 방법은 모듈에서 제공하지 않습니다. 스레드를 중지하는 방법을 구현하는 몇 가지 트릭을 보았지만이 중 아무 것도 나를 위해 일하지 않았습니다.스레딩 모듈 파이썬 스톱 중지 및 다시 시작 스레드

내 프로그램에는 모든 기능을 보여주는 기본 창이 있으며이 기능 중 하나는 버튼이있는 "function2"를 수행하는 다른 창을 엽니 다. "function2"가 실행되는 동안 작업을 수행 할 수있게하려면 Windows를 고정시키지 말아야합니다. 따라서 threading.Thread을 사용하여 "function2"를 정의하고 Thread.run() 메서드를 호출했습니다.
이 기능은 훌륭하지만 "function2"가 완료되면 스레드를 한 번만 시작할 수 있기 때문에 함수를 다시 실행할 수 없습니다.

나는 누군가가 나를 도울 수 있다면, 나는 이것을 기쁘게 생각한다.
감사합니다.

+0

"재실행"이란 무엇을 의미합니까? 그냥 새 스레드를 시작 하시겠습니까? 쓰레드를 멈추고 싶다면, 주기적으로 그 쓰레드의 공유 상태를 체크해야한다. – freakish

+0

@freakish function2가 1에서 10까지의 숫자를 인쇄하는 것처럼 함수가 모든 숫자를 인쇄하면 function2가 다시 실행되어 1에서 10으로 인쇄되도록하려는 경우와 같은 동작을 다시 수행합니다. –

+0

Ok ? function2로 다른 스레드를 시작할 수없는 이유는 무엇입니까? 어쩌면 우리에게 몇 가지 코드를 보여주고 실제로 일어날 것과 실제로 일어나고있는 것이 무엇인지 말해 주어야합니다. – freakish

답변

1

의견이 확장되었습니다. 당신이해야하는 것은 기본적으로 하나 개의 스레드를 만들고하려고

fun2 = threading.Thread(name='funcion2',target=funcion2) 
ttk.Button(loginpanel,text='Initfun2',command=fun2.start) 

입니다 클릭에를 다시 실행합니다.

def fun2(): 
    threading.Thread(name='funcion2',target=funcion2).start() 
ttk.Button(loginpanel,text='Initfun2',command=fun2) 

이 또 다른 단점을 가지고 더 나은 동안 : 재들이받은 스레드 같은 건 그래서 대신에 당신이 클릭에 새 스레드를 만들 필요가 없다 누군가가 미친처럼 버튼을 클릭하면 시작 어떤 경우? 사용할 스레드 수를 제한하려고합니다.

from concurrent.futures import ThreadPoolExecutor 

THREADPOOL = ThreadPoolExecutor(10) 
def fun2(): 
    THREADPOOL.submit(funcion2) 
ttk.Button(loginpanel,text='Initfun2',command=fun2) 

이 코드는 Python3.x입니다 : 그 사용 a thread pool을 위해 좋은 방법입니다. 파이썬 2에서는 외부 라이브러리가 필요하다고 생각합니다.

+0

자, 이제 모든 것을 이해했습니다. 도와 주셔서 감사합니다. 지금 다른 질문을 물어 보겠습니다. Threadpool을 사용하고 10 대신에 한계를 고치면 (단지 더 적기 때문에) 5 회 버튼을 클릭하고 function2가 올바르게 실행되고 5 회 완료됩니다. 다시 버튼을 클릭 할 수 없습니까? –

+0

@ DavidGonzálezBlazman 버튼을 클릭 할 수 있습니다. 무슨 일이 일어날 것인가는'funcion2'에 대한 호출이 스케쥴 될 것이고, 스레드 풀이 자유 자원을 가지 자마자 ('funcion2'에 대한 이전 호출이 한번 일어날 것입니다.) 해고 될 것입니다. 또한 이러한 함수간에 상태를 공유하는 경우 (예 : 전역을 업데이트 할 때) 잠금이 필요합니다. – freakish

+0

내가 링크 된 문서를 읽고 있었는데 shutdown() 메서드를 사용하는 것이 가능합니까? –