2016-09-17 5 views
0

をlock.acquireを中断することはできません、のpython 3.4は))(Windowsで

import threading 
l = threading.Lock() 
l.acquire() 
l.acquire() 

は、デッドロックをトリガし、CTRL + Cは、それを停止することはできません。あなたはプロセスを殺す必要があります。一方

import time 
time.sleep(100000) 

は、CTRL + Cで、いつでも中断することができます(私は他のいくつかのSOの質問/回答にそう読んだが、それは正常に動作します)

どちらのOSに依存していますシステムコールはなぜロックのために働いていないのですか?sleepのために働いていますか?それはtime.sleep(1000000)が(およそ)for i in range(10000000): time.sleep(0.1)と等価であり、細かく中断することができるからですか?

+0

については

他の重要なリソースに適合させることができる
import threading import time,sys l = threading.Lock() def run(): global l l.acquire() l.acquire() t = threading.Thread(target=run) t.start() while True: try: time.sleep(1) except KeyboardInterrupt: print("quitting") l.release() break 

(ソケット)メインスレッドの 'time.sleep'は、シグナルハンドラによって設定されたWindowsイベントを待ちます。このイベントの待機は、最新の3.6ベータ版のイベントであるCPythonでは一貫してサポートされていません。 – eryksun

答えて

0

スレッドを必要とし、メインプログラムcooperatesがスレッドを必要とする回避策が見つかりました。

のは、このプログラムを考えてみましょう:

import threading 

l = threading.Lock() 
l.acquire() 
l.acquire() 

ブロックをプログラムし、CTRL + Cで中断することができないこと。あなたはプロセスを殺す必要があります。

今、スレッドロックを使用してブロッキングコールを実行するスレッドを作成しています。 Ctrl + Cを押すと、プログラムを中断してロックを解除します。

はそれに協力した以外のスレッドを殺すために方法はありませんので、あなたは、スレッドがやっていることを知っている必要があります: