Python: Pinkg Link с процессором пула и MySQL - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть огромная база ссылок, на которые я должен пинговать, чтобы увидеть, живы ли они, я использую ProcessPoolExecutor, чтобы проверить максимум за секунды.

Я пытаюсь проверить каждую веб-страницу с помощью скрипта Python и обновить базу данных MySQL после проверки. Моя проблема возникает из-за обновления MySQL, когда я проверяю вывод сценария без обновления MySQL, все работает отлично, но когда я пытаюсь обновить базу данных с последней проверенной проверкой, блок сценария при первом обновлении. Я работаю на 100 ссылок, потому что мне не хватит памяти, если я попытаюсь получить их все сразу. Вот мой сценарий:

import concurrent.futures
import time
import mysql.connector
from urllib.request import *
import urllib.request
from bs4 import BeautifulSoup

MainDB = mysql.connector.connect(
  host="**************",
  user="********",
  passwd="***********",
  database="**********"
)
Maincursor = MainDB.cursor(buffered=True)

def Dead(Link):
    Date = time.strftime('%Y-%m-%d %H:%M:%S')
    print(Date,':',Link,'is Dead')
    try:
        SQLInsert = "UPDATE ******** SET Alive=%s, LastTimeSeen=%s WHERE Link = %s"
        DataInsert= (0,Date,Link)
        Maincursor.execute(SQLInsert,DataInsert)
        MainDB.commit()
    except mysql.connector.Error as err:
        print("Error Updating Dead : '%s'",format(err))
        MainDB.rollback()

def Alive(Link):
    Date = time.strftime('%Y-%m-%d %H:%M:%S')
    try:
        SQLInsert = "UPDATE ******** SET Alive=%s, LastTimeSeen=%s WHERE Link = %s"
        DataInsert= (1,Date,Link)
        Maincursor.execute(SQLInsert,DataInsert)
        MainDB.commit()
    except mysql.connector.Error as err:
        print("Error Updating Alive : '%s'",format(err))
        MainDB.rollback()

def load_link(Link):
    try:
        html_offer = urlopen(Link)
    except urllib.error.HTTPError as err :
        return 0
    except urllib.error.ContentTooShortError as err :
        return 0
    except urllib.error.URLError as err :
        return 0
    else:
        return 1

while(1):
    SQL = "SELECT COUNT(ID) FROM *****"
    try:
       Maincursor.execute(SQL)
       MainDB.commit()
    except mysql.connector.Error as err:
        print("Error Getting Count : '%s'",format(err))
    Found = Maincursor.fetchone()
    if Found[0] > 0:
        for x in range(0,Found[0],100):
            SQL = "SELECT Link FROM ***** LIMIT %s,100"
            try:
               Maincursor.execute(SQL,(x,))
               MainDB.commit()
            except mysql.connector.Error as err:
                print("Error Selecting 100 Rows : '%s'",format(err))
            Found = Maincursor.rowcount
            if Found > 0:
                Identified = Maincursor.fetchall()
                x = []
                for item in Identified:
                    x.extend(item)
                with concurrent.futures.ProcessPoolExecutor() as executor:
                    for Link, alive in zip(x, executor.map(load_link, x)):
                        if alive==1:
                            Alive(url)
                        else:
                            Dead(url)

Я пробовал с MySQL Pool, с различной многопроцессорностью, но каждый раз, когда база данных MySQL не может поддерживать количество запросов. Я также пытался с новым соединением MySQL для функции Dead / Alive, но та же проблема. Я хотел бы знать, почему мой скрипт останавливается после первого обновления?

...