2009-12-15 13 views
8

Tôi muốn nói cho các chủ đề Python của mình có năng suất, và vì vậy hãy tránh hogging CPU một cách không cần thiết. Trong Java, bạn có thể làm điều đó bằng cách sử dụng hàm Thread.yield(). Tôi không nghĩ có một cái gì đó tương tự trong Python, vì vậy tôi đã sử dụng time.sleep(t) nơi t = 0.00001. Đối với t=0 có vẻ như không có hiệu lực.Trong đó có cái gì đó tương tự như Thread.yield của Java() bằng Python? Điều đó thậm chí có ý nghĩa không?

Tôi nghĩ rằng có lẽ có điều gì đó tôi không hiểu chính xác về mô hình luồng của Python, và do đó lý do cho số thiếu thread.yield(). Ai đó có thể làm rõ điều này với tôi? Cảm ơn!

PS: Đây là những gì các tài liệu cho Java Thread.yield() nói:

Nguyên nhân hiện đang thực hiện đối tượng thread để tạm thời dừng lại và cho phép đề khác để thực thi.

+1

khi t = 0, nó mang lại cho bất kỳ chủ đề nào khác đã sẵn sàng –

+0

Ok. Cảm ơn. Tôi đã thử điều đó nhưng dường như không hoạt động. Có lẽ tôi đang đo sai. – Carlos

Trả lời

3

Thông dịch viên sẽ chuyển từ một thread khác theo định kỳ nào mà không cần sự can thiệp của bạn - bạn không cần phải nói cho các hệ thống không 'con heo' a thread.

Tuy nhiên, trong các trường hợp bình thường, chỉ một chuỗi Python đang thực thi tại một thời điểm. (Các trường hợp ngoại lệ có xu hướng xoay quanh thời gian khi các chuỗi đang chờ đầu vào từ các thiết bị bên ngoài như đĩa cứng hoặc mạng.) Điều này là do Global Interpreter Lock. Tuy nhiên, điều này có nghĩa là bạn có thể không nhận được nhiều lợi ích từ các luồng trong Python như bạn làm trong Java hoặc nhiều ngôn ngữ khác. Bắt xung quanh vấn đề này không nhất thiết là tầm thường, mặc dù di chuyển đến multiprocessing thay vì đa luồng là một cách tiếp cận tốt, nếu có thể. Tuy nhiên, những gì bạn muốn làm có vẻ thiếu sót trong một số ý nghĩa - nếu bạn có 2 chủ đề và cả hai đều có công việc để làm, bạn không cần phải viết mã phía ứng dụng để chuyển đổi giữa chúng. Đó là công việc của hệ điều hành hoặc máy ảo. Nếu bạn thấy mình nói một luồng 'làm ít hơn' vì bạn muốn ưu tiên một chuỗi khác về thời gian xử lý, thì thay vì thêm vào tùy ý hoặc ngủ, có lẽ bạn nên đặt ưu tiên luồng thay thế. (Mặc dù một lần nữa, điều này có thể không có nhiều ý nghĩa trong Python với sự hiện diện của Khóa thông dịch toàn cầu.)

+0

Điều gì sẽ xảy ra khi một luồng không sinh lời, là nó bắt đầu bỏ đói các chủ đề khác. Java và C (pthreads) có năng suất để báo cho bộ lập lịch biết rằng luồng là "miễn phí". Câu trả lời ở đây: http://stackoverflow.com/questions/787803/how-does-a-threading-thread-yield-the-rest-of-its-quantum-in-python/787810#787810 dường như cung cấp thêm một số cái nhìn sâu sắc, nhưng có vẻ như tôi không thể có được nó. – Carlos

+0

Tôi nghĩ rằng bạn đang hiểu lầm cách các luồng hoạt động trên hầu hết các hệ thống. Hệ thống sẽ tự động chuyển giữa các luồng một cách thường xuyên để tất cả các luồng có thể chạy. (Điều này được gọi là 'pre-emption' hoặc 'multitasking preemptive'.) Bạn không cần chuyển đổi thủ công giữa chúng trên Java hoặc Python. Các phương thức như yield() trên các hệ thống như vậy là một tối ưu hóa nhỏ, không phải là một yêu cầu. – Kylotan

+1

Không, không. Tôi biết về sự ủng hộ trước. 'Yield' tôi đang đề cập đến (trong trường hợp Java hoặc pthreads) chỉ đơn giản là thông báo cho bộ lập lịch. Đó là một cách để đề xuất một điểm tiền thưởng. Như bạn nói nó là một tối ưu hóa. Tôi cần phải đi và đọc thêm về GIL. Cảm ơn. – Carlos

0

Thread.yield() bị thiếu từ python vì có lẽ nó đã bị lãng quên hoặc nhà thiết kế nghĩ rằng tất cả đồng bộ hóa và các vấn đề truyền thông interprocess có thể giải quyết được mà không có Thread.yield().

Tôi muốn sử dụng Thread.yield() cho sự cố sau:

Ví dụ: có một hàng đợi công việc và có 2 chuỗi công nhân có thể tìm nạp các mục nhập từ hàng đợi công việc và các mục nhập địa điểm vào hàng đợi công việc. Một cách để giải quyết nó là sử dụng lớp threading.Condition. Khi nhân viên 'B' muốn tìm nạp hàng đợi, nhưng hàng đợi trống, nó sẽ đợi trạng thái chờ (Condition.wait()). Khi nhân viên 'A' nhập vào hàng đợi, nó đánh thức nhân viên 'B' (Condition.notify()). Tại thời điểm này năng suất là điều cần thiết, bởi vì nếu nhân viên 'A' không sinh lời ở đây, nhân viên 'A' có thể lấy nhiệm vụ trước khi nhân viên đánh thức 'B' gây ra vấn đề về chủng tộc.

Tôi tự hỏi làm thế nào nó có thể giải được mà không có Thread.yield().

+3

OP không hỏi tại sao 'thread.yield()' bị thiếu trong python? Tôi không nghĩ rằng một lời giải thích của 'thread.yield()' phù hợp với câu hỏi. – m02ph3u5

+0

Chắc chắn. Nhưng nhiều người đang tranh luận về năng suất đó là không cần thiết, bởi vì trước sự chấp nhận. Tôi nghĩ rằng thread.yield() là mất tích, bởi vì nó đã được chỉ đơn giản là quên. – Endre

+0

Ok, tôi đã chỉnh sửa câu trả lời của mình để đưa ra câu trả lời có thể cho "tại sao nó bị thiếu?" câu hỏi. – Endre