Loại điều này có thể đạt được với các đồng thường trình đã được tích hợp vào bản phân phối chuẩn Python kể từ phiên bản 2.5. Nếu IronPython và co hoàn toàn tuân thủ tất cả các tính năng của Python 2.5 (tôi tin là chúng), bạn sẽ có thể sử dụng thành ngữ này.
Xem this post để biết thêm thông tin về cách chúng có thể được sử dụng :) Cụ thể, bạn sẽ quan tâm đến PDF. .
Bạn cũng có thể muốn xem Gogen hoặc Kamelia cho ý tưởng: các dự án này đều có triển khai coroutine trăn thuần túy mà bạn có thể áp dụng hoặc sử dụng làm tham chiếu cho việc triển khai của riêng bạn. Hãy xem this page để có phần giới thiệu nhẹ nhàng về cách làm việc của cogen
.
Lưu ý có một số khác biệt giữa việc triển khai đồng thường xuyên tại đây và triển khai greenlet
. Việc triển khai python tinh khiết đều sử dụng một số loại lịch trình bên ngoài nhưng ý tưởng về cơ bản là giống nhau: chúng cung cấp cho bạn một cách để chạy các tác vụ hợp tác nhẹ mà không cần phải đề cập đến các chủ đề. Ngoài ra, cả hai khung công tác được liên kết ở trên đều hướng đến IO không đồng bộ rất giống với chính bản thân số greenlet
.
Dưới đây là ví dụ bạn được đăng nhưng viết lại sử dụng cogen
:
from cogen.core.coroutines import coroutine
from cogen.core.schedulers import Scheduler
from cogen.core import events
@coroutine
def test1():
print 12
yield events.AddCoro(test2)
yield events.WaitForSignal(test1)
print 34
@coroutine
def test2():
print 56
yield events.Signal(test1)
yield events.WaitForSignal(test2)
print 78
sched = Scheduler()
sched.add(test1)
sched.run()
>>> 12
>>> 56
>>> 34
Đó là rõ ràng hơn một chút so với phiên bản greenlet
(ví dụ sử dụng WaitForSignal
để tạo ra một cách rõ ràng một điểm khôi phục) nhưng bạn sẽ nhận được các ý tưởng chung.
chỉnh sửa: Tôi chỉ khẳng định rằng công trình này sử dụng Jython
KidA% jython test.py
12
56
34
IronPython và Jython chạy trên máy ảo đó là hoàn toàn ren và có riêng của họ async IO gọi - bạn sẽ không sử dụng những? – Mark
Cuối cùng có, nhưng tôi đã suy nghĩ về việc viết một phiên bản python tinh khiết trước khi thêm các phiên bản VM cụ thể. Hình thức kiểm soát dòng chảy này không hoàn toàn trực quan. – Tristan
Theo nhận xét về một trong các câu trả lời, mục tiêu cuối cùng của bạn là sử dụng 'eventlet' trong IronPython hoặc Jython. Điều đó sẽ không hoạt động — không phải vì 'greenlet', mà là vì 'libevent', một thư viện C mà' eventlet' kết thúc và phụ thuộc vào vòng lặp sự kiện và lò phản ứng của nó. Bạn có thể hình dung lại toàn bộ API 'libevent' trên đầu trang của vòng lặp .NET hoặc Java (ít nhất là nếu bạn không quan tâm đến hiệu suất, như bạn nói bạn không làm), nhưng đó là toàn bộ công việc. – abarnert