2013-09-03 3 views
2

Здесь код, который скачивает 3 файла и что-то с ним делать. Но перед тем, как начать Thread2, он ждет завершения Thread1. Как заставить их работать вместе? Укажите несколько примеров с комментариями. ThanksPython parallel threads

import threading 
import urllib.request 


def testForThread1(): 
    print('[Thread1]::Started') 
    resp = urllib.request.urlopen('http://192.168.85.16/SOME_FILE') 
    data = resp.read() 
    # Do something with it 
    return 'ok' 


def testForThread2(): 
    print('[Thread2]::Started') 
    resp = urllib.request.urlopen('http://192.168.85.10/SOME_FILE') 
    data = resp.read() 
    # Do something with it 
    return 'ok' 


if __name__ == "__main__": 
    t1 = threading.Thread(name="Hello1", target=testForThread1()) 
    t1.start() 
    t2 = threading.Thread(name="Hello2", target=testForThread2()) 
    t2.start() 
    print(threading.enumerate()) 
    t1.join() 
    t2.join() 
    exit(0) 
+5

Выполнение функции назначения нитей в назначении потоков. Фактически вы выполняете 'threading.Thread (name = 'Hello1', target = 'ok')'. Попробуйте 't1 = threading.Thread (name =" Hello1 ", target = testForThread1) вместо этого. –

ответ

3

Выполняется целевая функция для потока в создании экземпляра потока.

if __name__ == "__main__": 
    t1 = threading.Thread(name="Hello1", target=testForThread1()) # <<-- here 
    t1.start() 

Это эквивалентно:

if __name__ == "__main__": 
    result = testForThread1() # == 'ok', this is the blocking execution 
    t1 = threading.Thread(name="Hello1", target=result) 
    t1.start() 

Это Thread.start() «s работа, чтобы выполнить эту функцию и сохранить свой результат где-то для вас, чтобы вернуть. Как вы можете видеть, предыдущий формат выполнял функцию блокировки в основном потоке, не позволяя вам распараллеливаться (например, он должен был закончить выполнение этой функции, прежде чем попасть в строку, где он вызывает вторую функцию).

Правильный способ установить нить в неблокируемому моды будет:

if __name__ == "__main__": 
    t1 = threading.Thread(name="Hello1", target=testForThread1) # tell thread what the target function is 
    # notice no function call braces for the function "testForThread1" 
    t1.start() # tell the thread to execute the target function 
0

Для этого мы можем использовать резьб, но это не эффективно, так как вы хотите, чтобы загрузить файлы. поэтому общее время будет равно сумме времени загрузки всех файлов. Если у вас хорошая скорость интернета, то многопроцессорная обработка - лучший способ.

import multiprocessing 


def test_function(): 
    for i in range(199999998): 
     pass 


t1 = multiprocessing.Process(target=test_function) 
t2 = multiprocessing.Process(target=test_function) 
t1.start() 
t2.start() 

Это самое быстрое решение. Вы можете проверить это с помощью следующей команды:

time python3 filename.py 

вы получите следующий вывод так:

real 0m6.183s 
user 0m12.277s 
sys  0m0.009s 

здесь, реальный = пользователь + SYS

время пользователя является время выполнения файла python для выполнения. , но вы можете видеть, что выше формула не удовлетворяет, потому что каждая функция принимает приблизительно 6.14. Но из-за многопроцессорности оба принимают 6.18 секунд и сократили время на многопроцессорное параллельное соединение.

Вы можете получить более подробную информацию об этом от here.