2016-07-19 97 views
6

concurrent.futures ile oynuyorum.Bir python concurrent.futures içinde time.sleep() nasıl kesilir

Şu anda benim geleceğim time.sleep(secs).

Future.cancel(), düşündüğümden daha az görünüyor. gelecek zaten yürütülüyorsa

ardından time.sleep() onun tarafından iptal almaz.

wait() için zaman aşımı parametresi için de geçerlidir. time.sleep()'u iptal etmiyor.

nasıl bir concurrent.futures infaz alır time.sleep() iptal etmek?

Test için ThreadPoolExecutor'u kullanıyorum.

+0

Kısa cevap - hiçbir şekilde ve işçilerinde uykunun büyük olasılıkla kullanım tasarımı, uzun cevap sorunu demektir - onları her zaman kırmak için imkanı ile özel uyku uygulama olanağı, ancak ne pythonic veya doğru değil. alternatif olarak kilit kullanımını kontrol edebilirsiniz. – Reishin

cevap

4

Bir işlevi ThreadPoolExecutor'a gönderirseniz, yürütücü işlevi bir iş parçacığında çalıştıracak ve geri dönüş değerini Future nesnesinde saklayacaktır. eşzamanlı parçacığı sayısı sınırlı olduğundan, sen seçeneği bir gelecek infaz bekleyeniptal var ama işçi iş parçacığı kontrol çağrılabilir geçirilen edildikten sonra, yürütme durdurmak için hiçbir yolu yoktur. Eğer kendinizi o olduğundan emin olduktan sorumludur iptal şey var istediğinizde Genel olarak

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 

:

bu kodu düşünün.

Bununla birlikte bazı hazır seçenekler vardır. E.g., asyncio kullanmayı düşünün, ayrıca have an example using sleep. Konsept, herhangi bir potansiyel olarak bloke etme operasyonu ne zaman çağrılırsa konuyu ele alır, bunun yerine kontrolü, en dıştaki bağlamda çalışan bir kontrol döngüsüne döndürür, sonuç elde edildiğinde yürütmenin sürdürülmesi gereken bir not ile birlikte - veya, Durumunuz, n saniye geçtikten sonra.

+0

Oh ne eğlenceli :-) Çok işlemciden concurrent.futures'a geçtim (diğer nedenlerden dolayı). Şimdi concurrent.futures 'den asyncio'ya geçiş yapmayı düşünüyorum ... :-). Yine de, Phillip, cevabın için teşekkürler! – guettli

+0

Btw'yi bekliyorsunuz, 'çok işlemcili' ile, uykuyu kesmek mümkün, çünkü elbette ki diğer işlemleri de öldürebilirsiniz. – Phillip

+0

@ "concurrent.futures" da "kill" yi kullanabileceğimi düşündüm. Sadece ThreadPoolExecutor'dan ProcessPoolExecutor'a geçmem gerekiyor. Yoksa bu yanlış mı? – guettli

1

Concurrent.futures hakkında fazla bir şey bilmiyorum, ancak bu mantığı kullanarak zaman kırmak için kullanabilirsiniz.

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

kesme veya kesme, döngü çıkması kullanılabilir) (sleep.time yerine() bir döngü kullanın veya bekleyin.

+0

Evet, bu işe yarayabilir. Bir çevirmeli bağlantı üzerinden sadece postaları okumak isteyen Finlandiyalı bir adam gibi hissediyor ... hmmm Bir olay döngüsüne ihtiyacım var .... Bir zamanlayıcıya ihtiyacım var .... ve sonunda bir işletim sistemi. – guettli