2014-02-09 6 views
1

На питона 2,7Python, с которого начинается нить?

#!/usr/bin/env python 
import time, threading, os 
def f1(arg1): 
    for i in xrange(arg1): 
     time.sleep(1) 
     print "i is: ", i 
     print threading.enumerate() 

if __name__ == '__main__': 
    t = threading.Thread(name="MyThread1", target=f1, args=(5,)) 
    t.start() 
    t.join() 

$ ./threadeg.py

i is: 0 
[<_MainThread(MainThread, started 140502713374464)>, <Thread(MyThread1, started 140502683985664)>] 

i is: 1 
[<_MainThread(MainThread, started 140502713374464)>, <Thread(MyThread1, started 140502683985664)>] 

i is: 2 
[<_MainThread(MainThread, started 140502713374464)>, <Thread(MyThread1, started 140502683985664)>] 

i is: 3 
[<_MainThread(MainThread, started 140502713374464)>, <Thread(MyThread1, started 140502683985664)>] 

i is: 4 
[<_MainThread(MainThread, started 140502713374464)>, <Thread(MyThread1, started 140502683985664)>] 

Вопрос:

Почему начали раз показывают, что основной поток начал после MyThread1? то есть MainThread_starttime - MyThread1_starttime> 0

+0

Быстрый бесполезный ответ, потому что я нахожусь на своем телефоне, но прочитал источник для модуля потоков, и он должен стать ясным :-) – Iguananaut

ответ

3

Выход ничего не говорит о том, какой поток был запущен первым, и неясно, почему вы думаете, что это так. Вы смотрите на целые числа, такие как 140502713374464? Если это так, это значения, возвращаемые Thread.ident(), и не имеют ничего общего с метками времени. Просто посмотрите на код для Thread.__repr__():

def __repr__(self): 
    assert self._initialized, "Thread.__init__() was not called" 
    status = "initial" 
    if self._started.is_set(): 
     status = "started" 
    self.is_alive() # easy way to get ._is_stopped set when appropriate 
    if self._is_stopped: 
     status = "stopped" 
    if self._daemonic: 
     status += " daemon" 
    if self._ident is not None: 
     status += " %s" % self._ident 
    return "<%s(%s, %s)>" % (self.__class__.__name__, self._name, status) 

Целые взяты из self._ident, что в кэше значение независимо от уникального целочисленного идентификатора платформы присваивает потоку.

На более высоком уровне CPython не сохраняет записи при запуске потока, поэтому не только вывод вашего образца не показывает эту информацию, ничто другое не будет. Если вы хотите отслеживать это, вам нужно будет реализовать его самостоятельно (например, в подклассе Thread, фиксируя время начала).

+0

Это то, что я получал в своем комментарии :) – Iguananaut

Смежные вопросы