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

  • Awesome Toys TV

    Awesome Toys

    18 HAZİRAN 2014
  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • michal lelkowski

    michal lelko

    9 Temmuz 2006