Python 3多处理 - 如何执行单个任务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 3多处理 - 如何执行单个任务相关的知识,希望对你有一定的参考价值。

非常感谢提前!

任务描述:我想使用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()
答案

“for i in range(5)”产生了相同的过程5次,创造了重复。这可以通过删除它并以更简单的方式创建过程来实现。

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

您的任务基本上是IO绑定的(您从许多远程服务器请求信息),因此您需要“同时”请求所有服务器并等待他们的回复。这是典型的用例,您应该使用Python等语言的并发功能。不知何故,多处理是实现并发的一种方法(严格来说这样的断言是不正确的)但是如果你需要请求数千台服务器会发生什么?创建数以千计的流程并不是一个好方法。

我推荐这篇文章:qazxsw poi

它将帮助您以非常有效的方式实现您想要做的事情。

以上是关于Python 3多处理 - 如何执行单个任务的主要内容,如果未能解决你的问题,请参考以下文章

1.1多线程上下文切换

Python GIL(全局解释器锁)

Java并发前期知识点

python爬取英雄联盟皮肤结合多线程的方法

Python:使用多处理池时使用队列写入单个文件

关于多线程提高程序执行速率的问题