2013-03-08 28 views
5

Tôi đã lấy mã mẫu từ Unterstanding eventlet.wsgi.server.Là một greenthread bằng một chủ đề "thực"

from eventlet import wsgi 
import eventlet 
from eventlet.green import time 
import threading 

def hello_world(env, start_response): 
    print "got request", eventlet.greenthread.getcurrent(), threading.currentThread() 
    time.sleep(10) 
    start_response('200 OK', [('Content-Type', 'text/plain')]) 
    return ['Hello, World!\n'] 

wsgi.server(eventlet.listen(('', 8090)), hello_world) 

Khi tôi truy cập máy chủ web qua các địa chỉ IP khách hàng khác nhau, tôi có thể thấy chúng được xử lý song song. Và với các bản in trong hello_world, tôi cũng có thể rằng chúng được xử lý trong hai greenthreads khác nhau nhưng trong cùng một hệ điều hành thread.

Tôi mới sử dụng Python. Tôi tò mò rằng nếu mỗi mối quan hệ greenthread đến một sợi hệ điều hành cơ bản?

+0

đề Xanh không dựa trên bất kỳ bản địa Các khả năng của hệ điều hành và chúng được quản lý trong không gian người dùng thay vì không gian hạt nhân – Chipmunk

Trả lời

5

Mỗi chuỗi màu xanh lá cây được gắn với chính xác một chuỗi Python được gắn với chính xác một chuỗi hệ điều hành. Về lý thuyết, Eventlet có thể phân phối các luồng màu xanh trên một số chuỗi Python, và do đó, các luồng hệ điều hành, nhưng đó là rất nhiều công việc vì lợi ích rất ít kể từ Mã Python không thực hiện song song trên CPython [1].

Quy tắc chung: nếu bạn muốn sử dụng nhiều lõi, hãy chọn ngôn ngữ khác với Python cách tốt nhất là chạy một số quy trình. Cách nhanh chóng là multiprocessing [2] (trong stdlib từ 2.6), cách mạnh mẽ là os.fork [3] [4] theo cách thủ công.

Chỉ cần làm rõ một chút về thuật ngữ: Đối với hầu hết các hệ điều hành phổ biến, cách duy nhất để thực thi mã song song là có nhiều chuỗi hệ điều hành. Nói đúng, yêu cầu của bạn được xử lý không song song nhưng đồng thời; chính xác vì chỉ có một chuỗi hệ điều hành. Tại bất kỳ thời điểm nào trong thời gian chỉ có một luồng màu xanh thực thi một số mã. Ngẫu nhiên, cùng một hạn chế áp dụng cho các chuỗi Python thông thường, đó là lý do tại sao Eventlet (hoặc các thư viện chủ đề màu xanh lá cây khác) chủ yếu hoạt động như thay thế drop-in và (chủ yếu) không gây ra bất kỳ lỗi mới bất thường nào.

Bạn có thể tìm thấy câu trả lời này hữu ích: https://stackoverflow.com/posts/14227272/revisions

[1] http://wiki.python.org/moin/GlobalInterpreterLock
[2] http://docs.python.org/2/library/multiprocessing.html
[3] http://docs.python.org/2/library/os.html#os.fork
[4] https://github.com/jonashaag/bjoern/blob/master/tests/fork.py

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