time.s ngủ - ngủ chủ đề hay quá trình?


Câu trả lời:


353

Nó chặn các chủ đề. Nếu bạn xem Modules / timemodule.c trong nguồn Python, bạn sẽ thấy rằng trong lệnh gọi đến floatsleep(), phần thực chất của thao tác ngủ được gói trong khối Py_BEGIN_ALLOW_THREADS và Py_END_ALLOW_THREADS, cho phép các luồng khác tiếp tục thực thi trong khi hiện tại Một người ngủ. Bạn cũng có thể kiểm tra điều này với một chương trình python đơn giản:

import time
from threading import Thread

class worker(Thread):
    def run(self):
        for x in xrange(0,11):
            print x
            time.sleep(1)

class waiter(Thread):
    def run(self):
        for x in xrange(100,103):
            print x
            time.sleep(5)

def run():
    worker().start()
    waiter().start()

Mà sẽ in:

>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102

3
Làm thế nào để minh họa một "chủ đề" đã bị chặn. Và tại sao không chỉ 5 và 103 không được in, trong khi tất cả các số khác được in. Sẽ thực sự hữu ích cho tôi nếu ai đó có thể giải thích.
akki

@akki: vui lòng hỏi một câu hỏi mới thay vì sử dụng các bình luận của một câu hỏi cũ. Ngoài ra, 5 được in (ngay trước 101).
Nick Bastin

8
Mở một câu hỏi mới để hỏi ý nghĩa của câu trả lời này? Điều đó có vẻ khá kỳ lạ với tôi. Và tôi có nghĩa là 11 (không phải 5), xin lỗi không thể sửa nhận xét của tôi bây giờ. Tôi thực sự cần một số trợ giúp để hiểu điểm mà câu trả lời này đang cố gắng thực hiện.
akki

Câu trả lời đầu tiên: Hàm phạm vi xrange (k, m) trả về các số k bao gồm tối đa m-1, do đó, danh sách biểu thức (xrange (100, 103)) trả về [100, 101, 102]. Điều này có nghĩa là độ dài (danh sách (xrange (k, m))) == m - k.
Jeff Younker

3
akki, Cụ thể hơn, time.s ngủ () chặn luồng được gọi là time.s ngủ (), nhưng nó giải phóng Python GIL để chạy các luồng khác (vì vậy nó không chặn tiến trình). Ví dụ của Nick không thực sự cho thấy việc chặn luồng, điều đó càng cho thấy GIL được phát hành (do đó cho thấy quá trình KHÔNG bị chặn). Tôi nghĩ rằng nếu anh ta có nhiều thứ hơn như một câu lệnh in sau time.s ngủ (5) trong luồng của người phục vụ (), thì nó sẽ cho thấy rằng việc in không xảy ra cho đến sau khi time.s ngủ (5) kết thúc (tức là chặn)
gunit

52

Nó sẽ chỉ ngủ các luồng ngoại trừ trong trường hợp ứng dụng của bạn chỉ có một luồng duy nhất, trong trường hợp đó, nó sẽ ngủ các luồng và cũng có hiệu quả quá trình.

Tuy nhiên, tài liệu về con trăn về giấc ngủ không chỉ rõ điều này, vì vậy tôi chắc chắn có thể hiểu được sự nhầm lẫn!

http://docs.python.org/2/l Library / time.html




13

Các chủ đề sẽ chặn, nhưng quá trình vẫn còn sống.

Trong một ứng dụng luồng đơn, điều này có nghĩa là mọi thứ đều bị chặn trong khi bạn ngủ. Trong một ứng dụng đa luồng, chỉ có luồng mà bạn rõ ràng 'ngủ' sẽ chặn và các luồng khác vẫn chạy trong quy trình.


3

Chỉ chủ đề trừ khi quá trình của bạn có một chủ đề duy nhất.


2

Quá trình không thể tự chạy được. Liên quan đến thực thi, quá trình chỉ là một thùng chứa cho các chủ đề. Có nghĩa là bạn không thể tạm dừng quá trình. Nó chỉ đơn giản là không áp dụng cho quá trình.


Huh? Điều này có thể đúng trên Windows hoặc một cái gì đó, nhưng chắc chắn không phải là phổ biến. Theo truyền thống, Unix hoàn toàn không có các luồng và vì vậy một chương trình Python chạy một tiến trình (với một luồng duy nhất, theo một nghĩa trừu tượng nào đó) là điều mà sleeplệnh sẽ tạm dừng.
tripleee

Thật buồn khi làm bạn thất vọng, nhưng trên Windows và tất cả các hệ thống * nix, đơn vị chạy chính là một luồng. Bạn không thể chạy tiến trình mà không có chủ đề. Nếu bạn thoát chủ đề cuối cùng, quá trình chấm dứt.
Denis The Menace

Điều này không trả lời câu hỏi. Đặc biệt, câu hỏi này là về Python. Python có Khóa phiên dịch toàn cầu (GIL). Nếu một luồng đã đi ngủ trong khi giữ GIL, nó sẽ chặn tất cả các luồng Python trong quy trình, bởi vì tất cả chúng đều có chung một khóa.
Cort Ammon

1

nó chặn một luồng nếu nó được thực thi trong cùng một luồng chứ không phải nó được thực thi từ mã chính

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.