2012-06-06 18 views
5

'da çalışıyorsa, sinyalleri işlemez. Standart kitaplık ile oynarken, python2 ve python3 arasında garip bir fark buldum. TCPServer farklı bir iş parçacığında çalışırken python2'de bir sinyal yakalamaya çalışırsam, sinyal işlenmez, ancak python3'te olmaz. "^ C"Python 2, TCPServer başka bir iş parçacığı

Starting server thread 
Waiting for server thread to shut down 
^CKilled 

: Burada

Bu python3 çıktısı olan

import signal 
import threading 
import sys 
if sys.version_info > (3,0): 
    from socketserver import TCPServer, BaseRequestHandler 
else: 
    from SocketServer import TCPServer, BaseRequestHandler 

def shutdown(signum, frame): 
    print("Shutting down server thread") 
    server.shutdown() 

server = TCPServer(
    ('127.0.0.1', 7654), 
    BaseRequestHandler 
) 
signal.signal(signal.SIGTERM, shutdown) 
signal.signal(signal.SIGINT, shutdown) 
server_thread = threading.Thread(target=server.serve_forever) 
print("Starting server thread") 
server_thread.start() 
print("Waiting for server thread to shut down") 
server_thread.join() 
print("Server thread terminated") 

sorunu yeniden üreten bir script:

Starting server thread 
Waiting for server thread to shut down 
^CShutting down server thread 
Server thread terminated 

Ve bu python2 dan Bir klavye kesmesi ve "Killed" bir sürece gönderdiğim sigkill.

Kapatma neden çağrılmadı?

+0

nasıl sürecine SIG_INT sinyal göndermek mi? – Tisho

+0

@ POSIX sistemlerinde Tisho, Control-C aktif programın bir SIGINT sinyali almasına neden olur. [wiki] (http://en.wikipedia.org/wiki/Control-C#In_command-line_environments) – Blin

+0

Tamam, en azından SIGKILL sinyalinin çalıştığını biliyoruz. SIGKILL'i kapatmaya bağlarsanız, işe yarayacak mı? – Tisho

cevap

4

Bana göre thread.join() bazı kilitler yapar ve sinyali yakalamayı engeller.

Python 2.7 aşağıdaki kodu test ettik ve o iş gibi görünüyor:

import time 
import signal 
import threading 
import sys 
if sys.version_info > (3,0): 
    from socketserver import TCPServer, BaseRequestHandler 
else: 
    from SocketServer import TCPServer, BaseRequestHandler 

def shutdown(signum, frame): 
    print("Shutting down server thread") 
    server.running = False 
    server.shutdown() 

server = TCPServer(
    ('127.0.0.1', 7654), 
    BaseRequestHandler 
) 
signal.signal(signal.SIGTERM, shutdown) 
signal.signal(signal.SIGINT, shutdown) 
server_thread = threading.Thread(target=server.serve_forever) 
print("Starting server thread") 
server_thread.start() 
server.running = True 
print("Waiting for server thread to shut down") 

while server.running: 
    time.sleep(1) 

server_thread.join() 
print("Server thread terminated") 
İlgili konular