time.sleep - iş parçacığı veya süreç uyur?


Yanıtlar:


353

İpliği engeller. Python kaynağındaki Modules / timemodule.c dosyasına bakarsanız, çağrıldığında floatsleep(), uyku işleminin önemli bölümünün bir Py_BEGIN_ALLOW_THREADS ve Py_END_ALLOW_THREADS bloğuna sarıldığını görürsünüz. biri uyur. Bunu basit bir python programı ile de test edebilirsiniz:

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

Hangi yazdıracak:

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

3
Nasıl bir "iş parçacığı" göstermek nasıl engellendi. Ve neden sadece 5 ve 103 yazdırılmıyor, diğer tüm numaralar yazdırılmıyor. Birisi açıklayabilir eğer benim için gerçekten yararlı olacaktır.
akki

@akki: lütfen eski bir sorunun yorumlarını kullanmak yerine yeni bir soru sorun. Ayrıca 5 baskı yapılır (101'den hemen önce).
Nick Bastin

8
Bu cevabın anlamını sormak için yeni bir soru mu açıyorsunuz? Bana çok garip geliyor. Ve 11 (5 değil) demek istedim, üzgünüm şimdi yorumumu düzeltemiyorum. Aslında bu cevabın hangi noktayı sağlamaya çalıştığını anlamak için yardıma ihtiyacım var.
akki

İlk cevap: xrange (k, m) aralık işlevi, k dahil sayıları m-1 dahil eder, böylece ifade listesi (xrange (100, 103)) [100, 101, 102] döndürür. Bu uzunluk anlamına gelir (list (xrange (k, m))) == m - k.
Jeff Younker

3
akki, Daha spesifik olarak time.sleep (), time.sleep () adlı iş parçacığını engeller, ancak diğer konuları çalıştırmak için Python GIL'i serbest bırakır (bu nedenle işlemi engellemez). Nick'in örneği gerçekten ipliğin tıkanmasını göstermedi, daha çok GIL'in serbest bırakıldığını gösterdi (böylece işlemin engellenmediğini gösteriyor). Sanırım garson () iş parçacığında time.sleep (5) sonra bir baskı deyimi gibi daha fazla şey olsaydı, baskı time.sleep (5) bitmiş kadar (yani engelleme) gerçekleşmediğini gösterirdi
gunit

52

Uygulamanızın yalnızca tek bir dişe sahip olması durumu dışında, sadece ipliği uyuyacaktır, bu durumda ipliği ve işlemi etkili bir şekilde uyuyacaktır.

Uyku ile ilgili python belgeleri bunu belirtmez, bu yüzden kesinlikle karışıklığı anlayabiliyorum!

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




13

İş parçacığı engellenir, ancak işlem hala canlıdır.

Tek bir dişli uygulamada, bu, uyurken her şeyin engellendiği anlamına gelir. Çok iş parçacıklı bir uygulamada, yalnızca açıkça 'uyuduğunuz' iş parçacığı engellenir ve diğer iş parçacıkları hala işlem içinde çalışır.


3

İşleminizde tek bir iş parçacığı yoksa yalnızca iş parçacığı.


2

Süreç tek başına çalıştırılamaz. Yürütme ile ilgili olarak, süreç sadece evreler için bir kaptır. Yani süreci hiç duraklatamazsınız. İşlem için geçerli değildir.


Ha? Bu, Windows veya başka bir şey için doğru olabilir, ancak kesinlikle evrensel olarak geçerli değildir. Unix geleneksel olarak hiçbir iş parçacığına sahip değildi ve bu nedenle bir Python programı, sleepkomutun duraklayacağı şey olan bir işlemi (tek bir iş parçacıklı, soyut anlamda) çalıştırıyor .
Üçlü

Sizi hayal kırıklığına uğrattığımız için üzgünüm, ancak Windows ve tüm * nix sistemlerde ana koşu birimi bir iş parçacığıdır. İşlemi iş parçacıkları olmadan çalıştıramazsınız. Son iş parçacığından çıkarsanız işlem sonlanır.
Denis The Menace

Bu soruya cevap vermiyor. Özellikle, bu soru Python ile ilgilidir. Python'un Küresel Tercüman Kilidi (GIL) vardır. Bir iş parçacığı GIL'i tutarken uyku moduna geçecek olsaydı, işlemdeki tüm Python iş parçacıklarını bloke eder, çünkü hepsi aynı kilidi paylaşır.
Cort Ammon

1

aynı iş parçacığında yürütülürse bir iş parçacığını ana koddan yürütülmediğinde engeller

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.