2009-07-27 29 views
8

Python iş parçacıkları ile ilgili kurallar nelerdir ve Unix sinyallerinin nasıl işlenir?Python thread + Unix sinyalleri semantik nedir?

SIGINT tarafından tetiklenen ancak Python çalışma zamanı tarafından dahili olarak işlenen KeyboardInterrupt mu, farklı şekilde işleniyor? signal belgelerine

cevap

9

Birincisi, signal modülü kullanarak sinyal işleyicileri kurarken, ana başlık adı altında oluşturmanız gerekir. Bunları ayrı bir iş parçacığında oluşturmaya çalışırsanız bir istisna alırsınız.

signal.signal() işlevi aracılığıyla kaydedilen sinyal işleyicileri her zaman ana iş parçacığında çağrılır. C seviyesinde dişlere sinyal göndermeyi destekleyen mimarilerde, Python çalışma zamanının iplikteki tüm sinyalleri göz ardı ettiğine ve Python-kod sinyali işleyicinize göndermek için kullandığı ana iş parçasında bir sinyal işleyicisine sahip olduğuna inanıyorum. thread modülü için

belgeleri tüm Unix sistemleri olmalıdır sizin için kullanılabilir signal modülü, yoksa (normalde SIGINT tarafından tetiklenir) KeyboardInterrupt istisna delivered to an arbitrary thread olabilir belirtmektedir. Bu durumda, ana iş parçacığına teslim edilir. signal olmadan bir sistemdeyseniz, iş parçanızda KeyboardInterrupt'u yakalamanız ve ana iş parçacığında yeniden yükseltmek için thread.interrupt_main()'u aramanız gerekir.

Daha fazla bilgi, thread ve signal modülleri için Python belgelerinde bulunabilir.

+0

İlginç, ben sadece ana iş parçacığı 'KeyboardInterrupt's alacağını düşündüm. –

+0

Evet! Kimin neden olmadığını biliyor. –

+1

Deneyimimde ve belgelerimi okuduğumda, 'signal' modülü mevcut olduğunda' KeyboardInterrupt' yalnızca ana konuya iletilir. – Miles

4

: sinyalleri ve ipler her ikisi de aynı programda kullanılırsa

Bazı dikkatli olunması gerekmektedir. Sinyallerin ve ipliklerin aynı anda kullanılmasında hatırlanması gereken en önemli şey: her zaman ana iş parçasında signal() işlemlerini gerçekleştirir. Herhangi bir iplik, bir alarm(), getsignal(), pause(), setitimer() veya getitimer(); sadece ana iplik yeni bir sinyal işleyicisi kurabilir ve ana iş parçacığı sinyalleri alacak tek kişi olacaktır (bu, temel iş parçacığı uygulaması tek tek iş parçacıklarına sinyal göndermeyi desteklese bile, bu Python sinyal modülü tarafından zorlanır). Bu, sinyallerin inter-thread iletişim aracı olarak kullanılamayacağı anlamına gelir. Bunun yerine kilitleri kullanın.