Управление потоком в потоке. - PullRequest
3 голосов
/ 21 сентября 2009

Я столкнулся с несколькими примерами управления потоками с помощью модуля потоков (используя Python 2.6).

Я пытаюсь понять, как этот пример вызывает метод run и где. Я этого нигде не вижу. Класс ThreadUrl создается в функции main () как «t», и именно здесь я обычно ожидаю, что код запустит метод «run».

Может быть, это не предпочтительный способ работы с потоками? Пожалуйста, просветите меня:

#!/usr/bin/env python

import Queue
import time
import urllib2
import threading
import datetime

hosts = ["http://example.com/", "http://www.google.com"]

queue = Queue.Queue()

class ThreadUrl(threading.Thread):
    """Threaded Url Grab"""
    def __init__(self, queue):
            threading.Thread.__init__(self)
            self.queue = queue

    def run(self):
            while True:
                    #grabs host from queue
                    host = self.queue.get()

                    #grabs urls of hosts and prints first 1024 bytes of page
                    url = urllib2.urlopen(host)
                    print url.read(10)

                    #signals to queue job is done
                    self.queue.task_done()

start = time.time()

def main():

    #spawn a pool of threads, and pass them queue instance
    for i in range(1):
            t = ThreadUrl(queue)
            t.setDaemon(True)
            t.start()

            for host in hosts:
                    queue.put(host)

    queue.join()
main()
print "Elapsed time: %s" % (time.time() - start)

Ответы [ 3 ]

7 голосов
/ 21 сентября 2009

За pydoc :

Thread.start()

Запустить активность потока.

Он должен вызываться не более одного раза для объекта потока. Это устраивает для метод объекта run (), который будет вызван в отдельный поток управления.

Этот метод вызовет исключение RuntimeException, если вызывается более чем один раз в том же объекте потока.

Способ думать об объектах python Thread состоит в том, что они берут некоторый кусок кода python, который написан синхронно (либо в методе run, либо через аргумент target), и оборачивают его в код C, который знает, как заставить его работать асинхронно. Прелесть этого в том, что вы можете обращаться с start как с непрозрачным методом: вам не нужно переопределять его, если вы не переписываете класс в C, но вы будете относиться к run очень конкретно. Это может быть полезно, если, например, вы хотите проверить логику вашего потока синхронно. Все, что вам нужно, это вызвать t.run(), и он будет выполняться так же, как и любой другой метод.

4 голосов
/ 21 сентября 2009

Метод run () вызывается за кулисами «threading.Thread» (концепции наследования и полиморфизма Google в ООП). Вызов будет выполнен сразу после вызова t.start ().

Если у вас есть доступ к threading.py (найдите его в папке python). Вы увидите имя класса Thread. В этом классе есть метод с именем "start ()". start () с именем '_start_new_thread (self .__ bootstrap, ())' запускает поток низкого уровня, который будет запускать метод-оболочку с именем '__bootstrap ()' новым потоком. '__bootstrap ()', затем, называется '__bootstrap_inner ()', что делает дополнительную подготовку перед, наконец, вызовом 'run ()'.

Читайте источник, вы можете многому научиться. : D

0 голосов
/ 21 сентября 2009

t.start() создает новый поток в ОС, и когда этот поток начинается, он вызывает метод run() потока (или другую функцию, если вы предоставляете target в конструкторе Thread)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...