У Python for * nix time.sleep()
блокує потік чи процес?
У Python for * nix time.sleep()
блокує потік чи процес?
Відповіді:
Він блокує нитку. Якщо ви подивитесь на Modules / timemodule.c у джерелі Python, ви побачите, що у виклику до floatsleep()
, істотна частина операції сну загорнута у блок Py_BEGIN_ALLOW_THREADS та Py_END_ALL__READS, що дозволяє іншим потокам продовжувати виконуватись під час поточного один спить. Ви також можете перевірити це за допомогою простої програми python:
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()
Який надрукує:
>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102
Він буде просто спати нитку, за винятком випадків, коли у вашій програмі є лише одна нитка, і в цьому випадку вона буде спати нитку і ефективно також виконувати процес.
Документація python уві сні не визначає цього, тому я, безумовно, можу зрозуміти плутанину!
Нитка блокується, але процес все ще живий.
У єдиному потоковому додатку це означає, що все заблоковано під час сну. У багатопотоковому додатку блокується лише той потік, який ви явно 'заспіваєте', а інші потоки все ще запущені в процесі.
Процес не піддається виконанню сам по собі. Що стосується виконання, процес є лише контейнером для ниток. Це означає, що ви взагалі не можете призупинити процес. Це просто не застосовується до процесу.
sleep
команда призупинить.
він блокує потік, якщо він виконаний у тому ж потоці, а не якщо він виконується з основного коду