2013-01-11 22 views

Trả lời

3

Trừ khi bạn sử dụng PyDLL hoặc PYFUNCTYPE; GIL được phát hành trong các cuộc gọi của ctypes. Do đó trình thông dịch Python sẽ xử lý SIGINT bằng cách nâng cao KeyboardInterrupt trong luồng chính nếu mã C không cài đặt trình xử lý tín hiệu của riêng nó.

Để cho phép mã Python chạy trong chuỗi chính; bạn có thể đặt các cuộc gọi ctypes vào một chủ đề nền:

import threading 

t = threading.Thread(target=ctypes_call, args=[arg1, arg2, ...]) 
t.daemon = True 
t.start() 
while t.is_alive(): # wait for the thread to exit 
    t.join(.1) 
+0

GIL! Tất nhiên. Cảm ơn, JF. Đó là giá trị cho bạn câu trả lời thay vì lấy nó cho bản thân mình. –

1

Bạn sẽ phải khai báo một bộ xử lý tín hiệu cho SIGINT, trong C, đó là, hy vọng, dự án của bạn.

+0

Trải nghiệm của tôi với SIGINT trong các đối tượng dùng chung là một trình xử lý là cần thiết. Nó là không đủ để chặn tín hiệu và có một sợi chờ đợi bằng cách sử dụng sigwait. –

1

Tôi đã sử dụng một giải pháp luồng nhưng sau đó chuyển sang một tín hiệu. công việc xung quanh Các tôi sử dụng là gửi SIGTERM từ handler SIGINT, ví dụ:

signal.signal(signal.SIGINT, lambda s, f : os.kill(os.getpid(), signal.SIGTERM)) 

Ở đây tôi chỉ muốn tiết kiệm một ý tưởng cốt lõi của giải pháp cho thấy nó nhanh hơn thời gian tiếp theo và lý do tại sao tôi đã thay đổi tiếp cận. Biến thể luồng không dành cho tôi vì OpenMP trở nên chậm hơn đáng kể khi nó được gọi không phải từ chuỗi chính.

Các vấn đề liên quan