2011-12-05 45 views
33

Tôi đã đọc điều đó trong CPython, ngăn xếp trình thông dịch (danh sách hàm Python được gọi đến điểm này) được trộn lẫn với ngăn xếp C (danh sách các hàm C được gọi trong mã của trình thông dịch). Nếu vậy, thì làm thế nào máy phát điện và coroutines được thực hiện? Làm thế nào để họ nhớ trạng thái thực hiện của họ? CPython có sao chép ngăn xếp của mỗi máy phát/coroutine đến và từ ngăn xếp hệ điều hành không? Hoặc không CPython chỉ đơn giản là giữ khung stack trên cùng của máy phát điện trên heap, kể từ khi máy phát điện chỉ có thể mang lại từ đó khung trên cùng?Máy phát điện và coroutines được triển khai như thế nào trong CPython?

+8

Tôi vô tình tự trả lời gần bốn năm sau đó bằng cách đồng tác giả một chương bao gồm giải thích về cách máy phát điện và coroutines được triển khai: http://aosabook.org/en/500L/a-web-crawler-with-asyncio -coroutines.html –

+0

Bài viết hay, rất dày đặc. –

+0

Không liên quan, nhưng ... làm thế nào bạn nhận được, trong vòng 4 năm, từ hỏi về cách máy phát điện được thực hiện để viết một chương sách với Guido về chủ đề này? :) – max

Trả lời

14

Hướng dẫn yield thực hiện ngữ cảnh thực hiện hiện tại dưới dạng đóng và biến đổi thành đối tượng sống riêng. Đối tượng này có phương thức __iter__ sẽ tiếp tục sau tuyên bố lợi nhuận này.

Vì vậy, ngăn xếp cuộc gọi được chuyển thành đối tượng heap.

+3

Điều quan trọng là phải làm rõ ngăn xếp C "phần cứng" và ngăn xếp Python hoàn toàn khác nhau, vì câu hỏi làm lẫn lộn cả hai. Câu trả lời của tôi làm rõ điều này. (@Rudi - bạn trả lời là tốt, tôi để lại bình luận để những người khác đến herecheck rằng một phần là tốt) – jsbueno

37

Khái niệm rằng ngăn xếp của Python và ngăn xếp C trong chương trình Python đang chạy được trộn lẫn có thể gây nhầm lẫn.

Ngăn xếp Python là thứ được phân tách hoàn toàn so với ngăn xếp C thực tế được trình thông dịch sử dụng. Các cấu trúc dữ liệu trên ngăn xếp Python thực sự là các đối tượng "khung" Python đầy đủ (thậm chí có thể được quan sát và có một số thuộc tính thay đổi trong thời gian chạy). Ngăn xếp này được quản lý bởi máy ảo Python, bản thân nó chạy trong C và do đó có một chương trình C bình thường, mức máy, ngăn xếp.

Khi sử dụng trình tạo và trình lặp, trình thông dịch chỉ lưu trữ đối tượng khung tương ứng ở nơi khác ngoài ngăn xếp chương trình Python và đẩy nó trở lại khi thực hiện quá trình tiếp tục của trình tạo. Điều này "ở một nơi khác" là đối tượng máy phát điện chính nó.Calling phương pháp "tiếp theo" hoặc "gửi" trên đối tượng máy phát điện gây ra điều này xảy ra.

+1

Đây là loại câu trả lời kỹ thuật tôi muốn nhìn thấy nhiều hơn trong StackOverflow. Cảm ơn! – glendon

+2

Tôi đã tra cứu nó sau khi đọc xong, vì vậy nếu có ai quan tâm thì đây là [CPython triển khai máy phát] (https://github.com/python/cpython/blob/master/Objects/genobject.c). Tôi khuyên bạn nên đọc câu trả lời này trước tiên, nó giúp hiểu mã nào. – spectras

-2

Một vài câu trả lời và nhận xét hiện có cho rằng Python duy trì "ngăn xếp chương trình" được tách biệt hoàn toàn với ngăn xếp C của máy ảo. Khiếu nại này là sai.

Kiểm tra liên kết: http://en.wikipedia.org/wiki/Stackless_Python

Python không tồn tại nhưng không phải là chủ đạo. Sự hiểu biết là câu hỏi đúng.

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