time.sleep - tidur thread atau proses?

Jawaban:

353

Itu memblokir utas. Jika Anda melihat di Modul / timemodule.c di sumber Python, Anda akan melihat bahwa dalam panggilan ke floatsleep(), bagian substantif dari operasi sleep dibungkus dalam blok Py_BEGIN_ALLOW_THREADS dan Py_END_ALLOW_THREADS, yang memungkinkan utas lain untuk terus mengeksekusi saat saat ini. satu tertidur. Anda juga dapat menguji ini dengan program python sederhana:

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()

Yang akan dicetak:

>>> thread_test.run()
0
100
>>> 1
2
3
4
5
101
6
7
8
9
10
102
Nick Bastin
sumber
3
Bagaimana cara mengilustrasikan "utas" telah diblokir. Dan mengapa tidak hanya 5 dan 103 yang tidak dicetak, sementara semua nomor lainnya dicetak. Akan sangat membantu saya jika ada yang bisa menjelaskan.
akki
@akki: tolong ajukan pertanyaan baru daripada menggunakan komentar dari pertanyaan lama. Juga, 5 akan dicetak (tepat sebelum 101).
Nick Bastin
8
Buka pertanyaan baru untuk menanyakan arti dari jawaban ini? Bagi saya itu agak aneh. Dan maksud saya 11 (bukan 5), maaf tidak dapat memperbaiki komentar saya sekarang. Saya benar-benar membutuhkan bantuan untuk memahami poin apa yang ingin dijawab oleh jawaban ini.
akki
Jawaban pertama: Fungsi rentang xrange (k, m) mengembalikan angka k inklusif hingga m-1 inklusif, sehingga daftar ekspresi (xrange (100, 103)) mengembalikan [100, 101, 102]. Ini berarti panjang itu (daftar (xrange (k, m))) == m - k.
Jeff Younker
3
akki, Lebih khusus, time.sleep () memblokir utas yang disebut time.sleep (), tetapi melepaskan Python GIL untuk menjalankan utas lainnya (sehingga tidak memblokir proses). Contoh Nick tidak benar-benar menunjukkan pemblokiran utas, ini lebih menunjukkan bahwa GIL dilepaskan (dengan demikian menunjukkan bahwa proses TIDAK DIBlokir). Saya pikir jika dia memiliki lebih banyak hal seperti pernyataan cetak setelah waktu. Tertidur (5) di utas pelayan (), itu akan menunjukkan bahwa cetak tidak terjadi sampai setelah waktu. Tidur (5) selesai (yaitu pemblokiran)
gunit
52

Itu hanya akan tidur utas kecuali dalam kasus di mana aplikasi Anda hanya memiliki satu utas, dalam hal ini ia akan tidur utas dan secara efektif proses juga.

Dokumentasi python tentang tidur tidak menentukan ini, jadi saya pasti bisa mengerti kebingungan!

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

Zach Burlingame
sumber
32

Hanya utas.

menemukan
sumber
13

Utas akan memblokir, tetapi prosesnya masih hidup.

Dalam aplikasi berulir tunggal, ini berarti semuanya diblokir saat Anda tidur. Dalam aplikasi multithreaded, hanya utas yang Anda 'tidur' secara eksplisit akan diblokir dan utas lainnya masih berjalan dalam proses.

Corey Goldberg
sumber
3

Hanya utas kecuali proses Anda memiliki utas tunggal.

Alifornia
sumber
2

Proses tidak bisa dijalankan dengan sendirinya. Sehubungan dengan eksekusi, proses hanyalah wadah untuk utas. Berarti Anda tidak dapat menghentikan proses sama sekali. Ini sama sekali tidak berlaku untuk proses.

Denis The Menace
sumber
Hah? Ini mungkin benar pada Windows atau sesuatu, tetapi tentu saja tidak secara universal. Unix secara tradisional tidak memiliki utas sama sekali, sehingga program Python menjalankan suatu proses (dengan satu utas, dalam beberapa pengertian abstrak) yang merupakan sleepperintah yang akan dijeda.
tripleee
Sedih mengecewakan Anda, tetapi pada Windows dan semua sistem * nix unit yang menjalankan utama adalah utas. Anda tidak dapat menjalankan proses tanpa utas. Jika Anda keluar dari utas terakhir, proses berakhir.
Denis The Menace
Ini tidak menjawab pertanyaan. Secara khusus, pertanyaan ini adalah tentang Python. Python memiliki Global Interpreter Lock (GIL). Jika sebuah utas pergi tidur sambil memegang GIL, itu akan memblokir semua utas Python dalam proses, karena semuanya berbagi kunci yang sama.
Cort Ammon
1

ia memblokir utas jika dijalankan dalam utas yang sama tidak jika dijalankan dari kode utama


sumber