2014-12-17 17 views
6

Tôi đang thử asyncio và phải trộn nó với một số mã chặn đa luồng thông thường, vì vậy tôi cần phải giảm tải thực thi bằng run_in_exector.Là loop.run_in_executor thread-an toàn của asyncio?

asyncio docs warn that "most functions" aren't threadsafe và rằng call_soon_threadsafe là chức năng chỉ an toàn chủ đề. Có một số khác, chẳng hạn như Future.add_done_callback, cũng được ghi rõ ràng là luồng an toàn. Sau đó nó có một câu sau đó nói rằng "bạn có thể sử dụng run_in_executor để chạy callbacks trong các chủ đề khác", nhưng không bình luận về thread-an toàn của nó cụ thể.

run_in_executor không phải là tài liệu an toàn chỉ chuỗi, nhưng nhìn vào nguồn, có vẻ như đó là luồng an toàn nếu các đường dẫn mã đúng được thực hiện.

Có ai biết nếu đó là coi là chuỗi an toàn, nhưng không được ghi lại theo cách đó?

+0

Bạn có ý nghĩa gì bởi "an toàn chỉ" trong ngữ cảnh này? Tài liệu sử dụng thuật ngữ đó để chỉ ra nếu nó an toàn để gọi một phương thức đã cho từ một luồng bên ngoài luồng đang chạy vòng lặp sự kiện 'asyncio'. Đó có lẽ không phải những gì bạn đang yêu cầu ở đây, mặc dù, là nó? – dano

+0

Đó chính xác là những gì tôi muốn nói. Tôi có một số mã đa luồng hiện có và đang cố gắng sử dụng asyncio với nó, vì vậy tôi cần một cách an toàn thread để lên lịch mã chặn. –

Trả lời

4

run_in_executor được coi là không threadsafe bởi đặc điểm kỹ thuật (xin lỗi, có vẻ như tuyên bố ngầm và có lẽ cần được làm rõ trong PEP-3156).

Ngay cả khi thực thi cụ thể là an toàn chỉ, vui lòng không giả định rằng mọi triển khai tuân thủ PEP-3156 cũng sẽ an toàn.

+2

Cách chính xác để làm cho nó (hoặc bất cứ điều gì) thread thread an toàn là để bọc nó trong call_soon_threadsafe: 'loop.call_soon_threadsafe (loop.run_in_executor, executor, callback, * args))' – Lucretiel

2

Tôi nghĩ điều đó hoàn toàn phụ thuộc vào những gì bạn cung cấp. Nó có hiệu quả chỉ cần bắt đầu một thread và chạy mã của bạn, vì vậy cho dù đó là thread an toàn hay không phụ thuộc vào những gì bạn nói với nó để làm.

2

Việc triển khai mặc định có vẻ là an toàn theo luồng nếu tham số thi hành không phải là Không có hoặc trình thực thi mặc định đã được đặt (gọi loop.set_default_executor()). Nếu không, hai người thi hành có thể được tạo ra.

Bạn có thể viết một bản vá để làm cho phương pháp an toàn chỉ ;-)

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