2016-09-02 5 views
0

Я хотел бы сделать то же самое в этой части скрипта, но, возможно, по-другому. Является ли это возможным? Этот скрипт ожидает, что все потоки будут готовы и запущены, а затем запустите while True of urllib.request ... Так как я не хочу копировать этот метод, есть ли другой способ сделать это?Дождитесь запуска всех потоков, прежде чем запускать их

import threading, urllib.request 

class request(threading.Thread): 
    def run(self): 
     while nload: 
      time.sleep(1) 
     while True: 
      urllib.request.urlopen("www.google.it") 

nload = 1 

for x in range(800): 
    request().start() 
    time.sleep(0.003) 
    print "Thread " + str(x) + " started!" 

print "The cycle is running..." 
nload = 0 
while not nload: 
    time.sleep(1) 

ответ

1

Лучшим способом является использование объекта threading.Event.

import threading, urllib.request 

go = threading.Event() 

class request(threading.Thread): 
    def run(self): 
     go.wait() 
     while True: 
      urllib.request.urlopen("www.google.it") 

for x in range(800): 
    request().start() 
    time.sleep(0.003) 
    print "Thread " + str(x) + " started!" 

print "The cycle is running..." 
go.set() 

Это гарантирует, что ни один поток не будет продвигаться мимо go.wait() линии до тех пор, пока go.set() называется. Он не может гарантировать, что потоки 800 пробудятся в тот же самый момент, так как количество ядер ЦП, планировщик вашей операционной системы, GIL python и, возможно, многие другие вещи, о которых я не знаю, не позволяют вам степень контроля.

+0

спасибо! оно работает! – Sperly1987