Trong Python cho * nix, time.sleep()
chặn chuỗi hoặc tiến trình?
Trong Python cho * nix, time.sleep()
chặn chuỗi hoặc tiến trình?
Câu trả lời:
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
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!
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.
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.
sleep
lệnh sẽ tạm dừng.
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