2016-07-19 3 views
6

나는 concurrent.futures으로 놀고있다.파이썬에서 time.sleep()을 깨는 방법 concurrent.futures

현재 내 전화는 time.sleep(secs)입니다.

Future.cancel() 나는 생각보다 적습니다.

미래가 이미 실행중인 경우 time.sleep()은 취소하지 않습니다.

wait()의 timeout 매개 변수와 동일합니다. 내 time.sleep()을 취소하지 않습니다.

concurrent.futures에서 실행되는 time.sleep()을 취소하는 방법은 무엇입니까?

테스트를 위해 ThreadPoolExecutor을 사용합니다.

+0

짧은 대답 - 노숙자의 사용은 디자인에 대한 문제, 오랜 대답 - 항상 휴식을 취할 수있는 맞춤형 수면을 구현할 수 있지만, 파이썬이나 정확하지는 않습니다. 다른 방법으로 잠금 사용을 확인할 수 있습니다. – Reishin

답변

4

ThreadPoolExecutor에 함수를 제출하면 실행 프로그램은 스레드에서 함수를 실행하고 Future 오브젝트에 반환 값을 저장합니다. 동시 스레드의 수가 제한되어 있으므로 의 옵션을 취소보류중인 미래가 실행되지만 일단 작업자 스레드의 제어가 호출 가능 호출에 전달되면 실행을 중지 할 방법이 없습니다. 당신은 당신 자신이 있는지 만들기위한 책임을 취소 해 뭔가를 할 때마다, 일반적으로

import concurrent.futures as f 
import time 

T = f.ThreadPoolExecutor(1) # Run at most one function concurrently 
def block5(): 
    time.sleep(5) 
    return 1 
q = T.submit(block5) 
m = T.submit(block5) 

print q.cancel() # Will fail, because q is already running 
print m.cancel() # Will work, because q is blocking the only thread, so m is still queued 

:

이 코드를 생각해 보자.

사용 가능한 일부 상용 옵션이 있습니다. 예.asyncio을 사용하는 것이 좋으며, 또한 have an example using sleep이라고 생각하십시오. 이 개념은 잠재적으로 블로킹 연산이 호출 될 때마다 항상 결과가 사용 가능할 때마다 실행을 계속해야한다는 메모와 함께 가장 바깥 쪽의 컨텍스트에서 실행되는 제어 루프에 제어를 반환함으로써 문제를 회피합니다. 당신의 경우, n 초 후에.

+0

오, 무슨 재미 :-) 나는 멀티 프로세싱에서 concurrent.futures (다른 이유로)로 바 꾸었습니다. 이제 concurrent.futures에서 asyncio ...로 전환하는 방법에 대해 생각하고 있습니다. 그럼에도 불구하고 필립, 답변 해 주셔서 감사합니다! – guettli

+0

다른 프로세스를'죽일 수 있기 때문에 Btw를'멀티 프로세싱 '으로 환영합니다.'sleep'을 방해 할 수있었습니다. – Phillip

+0

@'concurrent.futures'에서도'kill '을 사용할 수 있다고 생각했습니다. 난 그냥 ThreadPoolExecutor에서 ProcessPoolExecutor로 전환해야합니다. 아니면 틀린가? – guettli

1

concurrent.futures에 대해 많이 알지 못하지만이 논리를 사용하여 시간을 단축 할 수 있습니다.

for i in range(sec): 
    sleep(1) 

인터럽트 또는 휴식 루프 나올 할 수 있습니다) (sleep.time 대신()를 루프를 사용하거나 기다립니다.

+0

예, 가능합니다. 그것은 단지 전화 접속 연결을 통해 hies 메일을 읽으려는 핀란드의 한 사람처럼 느껴집니다 ... hmmm 이벤트 루프가 필요합니다 ... 저는 스케줄러가 필요합니다 .... 그리고 마침내 운영 체제가 필요합니다. – guettli