2009-04-24 11 views
36

Tôi đã có một chuỗi đang bỏ phiếu cho một phần cứng.Làm thế nào để một luồng.Thread mang lại phần còn lại của lượng tử trong Python?

while not hardware_is_ready(): 
    pass 
process_data_from_hardware() 

Nhưng còn có các chủ đề khác (và quy trình!) Có thể có những việc cần làm. Nếu vậy, tôi không muốn đốt cháy cpu kiểm tra phần cứng mọi hướng dẫn khác. Nó đã được một thời gian kể từ khi tôi đã xử lý với luồng, và khi tôi đã làm nó không Python, nhưng tôi tin rằng hầu hết các thư viện luồng có một chức năng yield hoặc một cái gì đó cho phép một thread để nói với lịch trình "Cung cấp cho các chủ đề khác một cơ hội. "

while not hardware_is_ready(): 
    threading.yield()   # This function doesn't exist. 
process_data_from_hardware() 

Nhưng tôi không thể tìm thấy bất kỳ tham chiếu nào giống như thế này trong tài liệu luồng. Python có một tuyên bố yield, nhưng tôi khá chắc chắn đó là một cái gì đó hoàn toàn khác (để làm với máy phát điện).

Điều chính xác cần làm ở đây là gì?

Trả lời

55

time.sleep(0) đủ để kiểm soát - không cần sử dụng epsilon dương. Thật vậy, time.sleep(0) MEANS "năng suất cho bất kỳ chủ đề nào khác có thể sẵn sàng".

+4

Tài liệu này có ở đâu đó không? Tôi nghĩ điều này có thể đúng - tôi đã nhìn thấy nó bằng các ngôn ngữ khác - nhưng tôi không thể tìm thấy một đề cập đến nó trong tài liệu Python. Ví dụ: –

+3

, http://docs.python.org/library/sched.html "delayfunc cũng sẽ được gọi với đối số 0 sau mỗi sự kiện được chạy để cho phép các chủ đề khác có cơ hội chạy trong các ứng dụng đa luồng." (delayfunc thường là time.sleep ở đây). Tôi đồng ý nó sẽ đẹp hơn nếu nó được ghi lại trực tiếp hơn trong thời gian của mô-đun ;-) –

+1

Cũng bị ẩn! Cảm ơn! –

11

Đọc trên Khóa thông dịch toàn cầu (GIL).

Ví dụ: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/

Ngoài ra: http://www.pyzine.com/Issue001/Section_Articles/article_ThreadingGlobalInterpreter.html

Làm điều này trong mã của bạn nếu bạn phải làm Bận chờ (ví dụ bỏ phiếu một thiết bị).

time.sleep(0.0001) 

Điều này sẽ mang lại cho trình lên lịch chuỗi.

Ngoài ra, tôi thu thập được một số ghi chú và tài liệu tham khảo trong http://homepage.mac.com/s_lott/iblog/architecture/C551260341/E20081031204203/index.html

+2

Tôi không có chuyên gia, nhưng tôi đã đọc một chút về GIL. Bạn có thể cho tôi một gợi ý những gì đặc biệt liên quan đến câu hỏi này? Tôi sẽ đi với 'time.sleep (epsilon) 'bây giờ, nhưng nó không thỏa mãn, phải không? Không có bất kỳ khoảng thời gian cụ thể nào tôi muốn ngủ. –

+0

Giải pháp duy nhất của nó nếu phần cứng của bạn không thể gửi ngắt. – Unknown

+0

Không sử dụng 'time.sleep()' làm thế nào để Python thực hiện năng suất dự phòng? Vào những điều kiện nào một sản lượng xảy ra? – CMCDragonkai

3

Nếu bạn đang làm điều này trên * nix, bạn có thể tìm thấy các thư viện select hữu ích. Kamaela cũng có một vài thành phần bạn có thể thấy hữu ích, nhưng nó có thể đòi hỏi một chút thay đổi mô hình.