2014-10-09 16 views
14

Các tài liệu cho asyncio đưa ra hai ví dụ cho cách in "Hello World" mỗi hai giây: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio-hello-world-callback https://docs.python.org/3/library/asyncio-task.html#asyncio-hello-world-coroutineVòng lặp sự kiện asyncio có thể chạy trong nền mà không đình chỉ trình thông dịch Python không?

tôi có thể chạy những từ người phiên dịch, nhưng nếu tôi làm tôi mất quyền truy cập các thông dịch viên. Vòng lặp sự kiện asyncio có thể chạy trong nền, để tôi có thể tiếp tục gõ lệnh tại trình thông dịch không?

Trả lời

29

Bạn có thể chạy vòng lặp sự kiện bên trong một sợi nền:

>>> import asyncio 
>>> 
>>> @asyncio.coroutine 
... def greet_every_two_seconds(): 
...  while True: 
...   print('Hello World') 
...   yield from asyncio.sleep(2) 
... 
>>> def loop_in_thread(loop): 
...  asyncio.set_event_loop(loop) 
...  loop.run_until_complete(greet_every_two_seconds()) 
... 
>>> 
>>> loop = asyncio.get_event_loop() 
>>> import threading 
>>> t = threading.Thread(target=loop_in_thread, args=(loop,)) 
>>> t.start() 
Hello World 
>>> 
>>> Hello World 

Lưu ý rằng bạn phải gọi asyncio.set_event_loop trên loop, nếu không bạn sẽ nhận được một lỗi nói rằng các chủ đề hiện tại không có một vòng lặp sự kiện.

Nếu bạn muốn tương tác với vòng lặp sự kiện từ chuỗi chính, bạn cần phải kết nối với các cuộc gọi loop.call_soon_threadsafe.

Trong khi loại điều này là một cách ok để thử nghiệm trong trình thông dịch, trong các chương trình thực tế, bạn có thể muốn tất cả mã của bạn chạy bên trong vòng lặp sự kiện thay vì giới thiệu chuỗi.

+1

Cảm ơn bạn rất nhiều. Ai đó [ở nơi khác] (http://monome.org/community/discussion/comment/208744#Comment_208744) cho biết không được trộn lẫn chủ đề và asyncio. Bạn có đồng ý không? Quá trình nền sẽ là một máy chủ OSC. Từ thông dịch viên tôi sẽ nói với nó những tín hiệu để gửi đi. Quá trình Python sẽ nhẹ, gửi hướng dẫn (có thể là 20 gói một giây) cho các bộ tổng hợp làm tất cả các phép toán âm thanh. Với động lực đó, bạn có tiếp tục đề xuất đưa mọi thứ vào vòng lặp chính không? –

+0

@ user916142 Vâng, thông thường, toàn bộ điểm sử dụng khung không đồng bộ như 'asyncio' là * tránh * sử dụng chuỗi. Nếu bạn luôn chạy mã này bên trong một thông dịch viên tương tác, thì tôi đoán nó có ý nghĩa. Nhưng thông thường tôi sẽ nói rằng bạn nên thực hiện một 'asyncio' 'Procotol' hoặc' Stream' xử lý các kết nối mạng đến, và sau đó cho nó biết những tín hiệu nào để gửi qua các yêu cầu mạng. – dano

+0

Cảm ơn! Tôi đã có một cái gì đó giống như user916142, với các chủ đề xử lý OSC, Midi, WebSockets, và các luồng dữ liệu nối tiếp. Tôi sẽ xem xét khả năng đưa tất cả vào một vòng lặp sự kiện, nhưng bây giờ chỉ cần tích hợp một mô-đun WebSockets phụ thuộc vào asyncio. – velotron

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