2016-03-12 2 views
0

im проверка моих клиентов, чтобы я знал, какая услуга я могу предложить bla bla ... , так что проблемами являются блоки потоков, например, он проверяет 15-20 и блокирует, я хочу решение, чтобы он продолжает код:Python threadings: threads block

import requests 
import re 
from sys import argv 
from Queue import Queue 
from threading import Thread 


e = argv[1] 

emails = open(e, 'r').readlines() 
emails = map(lambda s: s.strip(), emails) 

valid=[] 

def base(email): 
    xo = requests.get("http://www.paypal.com/xclick/business="+email,  headers={"User-Agent":"Mozilla/5.0 (Windows NT 5.0; rv:21.0) Gecko/20100101 Firefox/21.0"}).text 
    x = re.search("s.eVar36=\"(.*?)\";", xo) 
    try: 
     if x.group(1) != "": 
      print "%s === %s" % (email,x.group(1)) 
      w=open(str(x.group(1))+".txt", 'a') 
      w.write(email+"\n") 
      valid.append(email) 
    except: 
     pass 

def work(): 
    email=q.get() 
    base(email) 
    q.task_done() 

THREADS = 25 
q=Queue() 

for i in range(THREADS): 
    t=Thread(target=work()) 
    t.daemon=True 
    t.start() 

if (len(argv)>0): 
    for email in emails: 
     q.put(email) 
    q.join()`enter code here 

заранее спасибо

+0

привет мне нужна помощь – script0r

+0

Проверьте эту строку: немогу = Thread (цель = работа()) 'Вы назвали функцию перед созданием потока. Вместо этого вы должны сделать 't = Thread (target = work)'. – tdelaney

+0

Ваш рабочий обрабатывает только одно электронное письмо, которое кажется странным. Подумайте об использовании 'multiprocessing.pool.ThreadPool'. – tdelaney

ответ

1

Ваша проблема заключается в том, что вы называете work() вместо передачи функции work при создании темы. Вместо того, чтобы вносить изменения в свой код, подумайте о перемещении ThreadPool python, который делает тяжелый подъем для вас. Вот пример, который реализует то, что вы хотите.

map называет вашего работника для каждого письма в итераторе и возвращает результат работника как итератор (python 3) или список (python 2). Ваш рабочий возвращает действительное электронное письмо или Нет для каждого отправленного им письма, поэтому вам нужно просто отфильтровать Nones в конце.

import requests 
import re 
from sys import argv 
import multiprocessing.pool 

e = argv[1] 

emails = [line.strip() for line in open(e)] 


def base(email): 
    print("getting email {}".format(email)) 
    try: 
     xo = requests.get("http://www.paypal.com/xclick/business="+email,  headers={"User-Agent":"Mozilla/5.0 (Windows NT 5.0; rv:21.0) Gecko/20100101 Firefox/21.0"}).text 
     x = re.search("s.eVar36=\"(.*?)\";", xo) 
     try: 
      if x.group(1) != "": 
       print "%s === %s" % (email,x.group(1)) 
       with open(str(x.group(1))+".txt", 'a') as w: 
        w.write(email+"\n") 
       return email 
     except: 
      pass 
    except requests.exceptions.RequestException as e: 
     print(e) 

THREADS = 25 
pool = multiprocessing.pool.ThreadPool(THREADS) 
valid = [email for email in pool.map(base, emails, chunksize=1) if email] 
print(valid) 
pool.close() 
+0

он продолжает блокировать снова так же, как без пула – script0r

+0

Место, где он блокируется, находится в 'pool.map', это проблема? Вы хотите, чтобы ваш код продолжался? Я предполагаю, что вы хотите «действительный» список когда-нибудь, и вы также не хотите выходить, пока работа не будет выполнена. Вы можете положить пул в свою нить и продолжить свой путь. – tdelaney

+0

request.exceptions.ConnectTimeout: HTTPConnectionPool (host = 'www.paypal.com', порт = 80): Максимальное количество попыток превышает ed с URL: /xclick/[email protected] (вызвано ConnectTimeoutError (<запросы. package.urllib3. connection.HTTPConnection object at 0x023E0770>, 'Соединение с www.paypal.com тайм-аут. (время ожидания подключения = 10)')) Исключение в потоке Thread-22 (скорее всего, при отключении интерпретатора): Исключение в потоке Thread- 10 (скорее всего, возникло во время выключения интерпретатора): ------------------------ Это ошибка, вызванная веб-сайтом? – script0r