Python 3 Multiprocessing - как выполнить одну задачу - PullRequest
0 голосов
/ 30 августа 2018

Очень ценится заранее!

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

Нужна помощь здесь ...

Коды:

import requests
import re
import telnetlib
import multiprocessing

def run(info1, info2):
    try:
        tn = telnetlib.Telnet(info1, port= info2, timeout= 2)
    except:
        print('not working !')
    else:
        proxy_server = 'http://' + info1 + ':' + info2
        print(proxy_server)

if __name__=='__main__':
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}
    html = requests.get('https://www.sslproxies.org', headers=headers, allow_redirects=False)
    pattern = re.compile('<td>(\d.*?)</td><td>(\d+)</td>', re.S)
    items = re.findall(pattern, html.text)
    for item in items:
        for i in range(5):
            p = multiprocessing.Process(target=run(item[0], item[1]), args=('msc%s' % i,))
            p.start()

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Ваша задача в основном связана с вводом-выводом (вы запрашиваете информацию со многих удаленных серверов), поэтому вам необходимо «одновременно» запрашивать все серверы и ждать их ответов. Это типичный случай использования, когда вы должны использовать возможности параллелизма языков, таких как Python. Так или иначе, многопроцессорная обработка является одним из способов достижения параллелизма (строго говоря, такое утверждение неверно), но что произойдет, если вам потребуется запросить тысячи серверов? Создание тысяч процессов - не самый лучший способ.

Я рекомендую эту статью: https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html

Это поможет вам очень эффективно добиться того, что вы пытаетесь сделать.

0 голосов
/ 30 августа 2018

"for i in range (5)" вызывал один и тот же процесс 5 раз, создавая повторение. Это может быть достигнуто простым удалением и созданием процесса более простым способом.

    for item in items:
            p = multiprocessing.Process(target=run, args=(item[0], item[1],))
            p.start()
...