2017-10-25 24 views
3

정확한주기적인 메서드 호출에 의존하는 많은 코드를 작성합니다. 내가 런타임의 스레드 풀 위에 통화를 제출 파이썬의 futures 라이브러리를 사용하여 루프에서 호출 사이에 자고했습니다 그러나Python 2.7에서 Go의`time.Tick` 또는 Netty의`HashedWheelTimer`와 비슷한 것이 있습니까?

executor = ThreadPoolExecutor(max_workers=cpu_count()) 

def remote_call(): 
    # make a synchronous bunch of HTTP requests 

def loop(): 
    while True: 
     # do work here 
     executor.submit(remote_call) 
     time.sleep(60*5) 

,이 구현은 실행의 긴 기간 (후 약간의 드리프트를 도입 것으로 나타났습니다 예를 들어 약 10 시간 동안이 코드를 실행하고 약 7 초의 드리프트가 있음). 내 일을 위해서 나는 이것을 정확한 순간에 실행해야하고, 밀리 세컨드는 훨씬 더 좋을 것이다. 어떤 사람들은 asyncio ("Fire and forget" python async/await)을 지적했지만, 파이썬 2.7에서이 작업을 수행하지 못했습니다.

나는 해킹을 찾고 있지 않습니다. 내가 진정으로 원하는 것은 Go의 time.Tick 또는 Netty의 HashedWheelTimer과 비슷한 것입니다.

+0

https://stackoverflow.com/questions/5568646/usleep-in-python 가능성이있는 속임수 –

+0

일부 운영 체제의 경우 차트가 흥미 롭습니다. https://stackoverflow.com/questions/1133857/how- 정확한 - 비단뱀 - 시간 - 수면 –

+0

아니, 거짓말. 이 말은 https://stackoverflow.com/a/34366451/1773216 – nmurthy

답변

5

파이썬에는 아무 것도 없습니다. 일하는 데 소요되는 시간을 고려하여 수동으로 수면 시간을 조정해야합니다. 당신이 반복 시작할 때 위의 시세 오히려 당신이 tick를 호출 할 때보다, 똑딱 시작되는

import itertools 
import time 
import timeit 

def tick(interval, initial_wait=False): 
    # time.perf_counter would probably be more appropriate on Python 3 
    start = timeit.default_timer() 

    if not initial_wait: 
     # yield immediately instead of sleeping 
     yield 

    for i in itertools.count(1): 
     time.sleep(start + i*interval - timeit.default_timer()) 
     yield 

for _ in tick(300): 
    # Will execute every 5 minutes, accounting for time spent in the loop body. 
    do_stuff() 

참고하면 중요한 :

당신은 많은 이동의 time.Tick의 채널처럼, 반복자로 그 배 수 티커를 시작하고 나중에 저장하십시오. 또한, 그것은 시간을 보내지 않으며 수신기가 느린 경우 틱을 떨어 뜨리지 않습니다. 원한다면 직접 조정할 수 있습니다.