time.sleep —スレッドまたはプロセスをスリープ状態にしますか?


回答:


353

スレッドをブロックします。PythonソースのModules / timemodule.cを見ると、への呼び出しfloatsleep()で、スリープ操作の実質的な部分がPy_BEGIN_ALLOW_THREADSおよびPy_END_ALLOW_THREADSブロックにラップされているため、現在のスレッドの実行中に他のスレッドが実行を継続できることがわかります一人が眠る。簡単な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

3
「スレッド」がどのようにブロックされるようになったのか。そして、5と103だけが印刷されないのに、他のすべての数値が印刷されるのはなぜですか。誰かが説明できたら、私にとって本当に役に立ちます。
akki 2017

@akki:古い質問のコメントではなく、新しい質問をしてください。また、5が印刷されます(101の直前です)。
Nick Bastin 2017

8
この回答の意味を尋ねる新しい質問を開きますか?それは私にはかなり奇妙に思えます。そして、私は11(5ではない)を意味し、申し訳ありませんが今私のコメントを修正することはできません。私は実際、この答えが何をしようとしているのかを理解するのに助けが必要です。
akki 2017

最初の答え:範囲関数xrange(k、m)は、kからm-1までの数値を返すため、式list(xrange(100、103))は[100、101、102]を返します。これは、length(list(xrange(k、m)))== m-kであることを意味します。
Jeff Younker、2017年

3
akki、より具体的には、time.sleep()はtime.sleep()を呼び出したスレッドをブロックしますが、Python GILを解放して他のスレッドを実行します(プロセスをブロックしません)。Nickの例は、スレッドのブロックを実際には示していません。GILが解放されていることを示しています(したがって、プロセスがブロックされていないことを示しています)。私は彼がウェイター()スレッドでtime.sleep(5)の後にprint文のようなより多くのものを持っていたならば、それは印刷がtime.sleep(5)終了(すなわち、ブロッキング)後まで起こらなかったことを示していると思います
gunit

52

アプリケーションにスレッドが1つしかない場合を除いて、スレッドをスリープさせるだけです。その場合、スレッドをスリープさせ、事実上プロセスもスリープさせます。

ただし、スリープに関するPythonのドキュメントではこれを指定していないため、混乱を確実に理解できます。

http://docs.python.org/2/library/time.html




13

スレッドはブロックされますが、プロセスはまだ生きています。

シングルスレッドのアプリケーションでは、これはあなたが眠っている間すべてがブロックされることを意味します。マルチスレッドアプリケーションでは、明示的に「スリープ」したスレッドのみがブロックし、他のスレッドはプロセス内で引き続き実行されます。



2

プロセスはそれ自体では実行できません。実行に関しては、プロセスはスレッドの単なるコンテナーです。つまり、プロセスを一時停止することはできません。プロセスには適用できません。


えっ?これはWindowsまたは何かに当てはまるかもしれませんが、確かに普遍的ではありません。Unixは伝統的にスレッドをまったく持っていなかったので、Pythonプログラムはsleepコマンドを一時停止するプロセス(抽象的な意味では単一スレッドで)を実行します。
tripleee 2017年

残念なことに、Windowsとすべての* nixシステムでは、主要な実行単位はスレッドです。スレッドなしでプロセスを実行することはできません。最後のスレッドを終了すると、プロセスは終了します。
Denis The Menace、

これは質問の答えにはなりません。特に、この質問はPythonに関するものです。Pythonにはグローバルインタープリターロック(GIL)があります。GILを保持している間にスレッドがスリープ状態になると、すべてが同じロックを共有するため、プロセス内のすべてのPythonスレッドがブロックされます。
Cort Ammon

1

メインコードから実行された場合ではなく、同じスレッドで実行された場合にスレッドをブロックします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.