SORU
10 EYLÜL 2009, PERŞEMBE


Klavye'çoklu Havuzu s python ile Kesme

Nasıl python Çoklu işlem Havuzları ile Keyboardİnterrupt olayları ele alabilir miyim? İşte bir örnek:

from multiprocessing import Pool
from time import sleep
from sys import exit

def slowly_square(i):
    sleep(1)
    return i*i

def go():
    pool = Pool(8)
    try:
        results = pool.map(slowly_square, range(40))
    except KeyboardInterrupt:
        # **** THIS PART NEVER EXECUTES. ****
        pool.terminate()
        print "You cancelled the program!"
        sys.exit(1)
    print "\nFinally, here are the results: ", results

if __name__ == "__main__":
    go()

Yukarıdaki kod çalıştırıldığında, KeyboardInterrupt ^C, ama sadece o noktada kilitleniyor işlemi bastığım zaman gündeme alır ve onu öldürmek zorundayım dışarıdan.

Herhangi bir zamanda ^C basın ve süreçlerin tüm incelikle çıkmak için neden mümkün olmak istiyorum.

CEVAP
11 EYLÜL 2009, Cuma


Python bu bir hata değildir. Bir iş parçacığı bir durum bekliyor.Durumu.() bekleyin, Keyboardİnterrupt hiçbir zaman gönderilmez. Yeniden oluşturma:

import threading
cond = threading.Condition(threading.Lock())
cond.acquire()
cond.wait(None)
print "done"

Keyboardİnterrupt dışında beklemek kadar yetişmez() verir, ve bir daha geri dönmedi, kesme hiç olmaz. Keyboardİnterrupt neredeyse kesinlikle bir bekleme koşulu kesmesi gerekir.

Bu eğer bir zaman aşımı; koşul belirtilmezse olmaz unutmayın.bekle(1) kesme alacaktır. Yani, geçici bir çözüm için bir zaman aşımı belirler. Bunu yapmak için, Değiştir

    results = pool.map(slowly_square, range(40))

ile

    results = pool.map_async(slowly_square, range(40)).get(9999999)

veya benzer.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • hotstrikegently

    hotstrikegen

    26 AĞUSTOS 2011
  • Metheud

    Metheud

    9 EYLÜL 2006
  • waterfairy17

    waterfairy17

    9 Aralık 2007