Python 3.x multiprocessing.dummy池映射的异常处理

Python 3.x multiprocessing.dummy池映射的异常处理,python-3.x,exception,python-requests,python-multiprocessing,python-multithreading,Python 3.x,Exception,Python Requests,Python Multiprocessing,Python Multithreading,免责声明:刚刚开始学习Python或一般的编码。所以请原谅我问了一些愚蠢的问题,或者不能正确地解释这个问题 我在做什么? 要请求一些URL(以快速异步方式或使用线程/多处理),请保存响应,对其中的某些内容进行grep并将其保存到文本文件中。使用bash可以很容易地完成,但是我希望它能够为将来的添加扩展,并学习python、python网络和多线程/处理的概念 我想出的工作代码: import os import subprocess from multiprocessing.dummy impo

免责声明:刚刚开始学习Python或一般的编码。所以请原谅我问了一些愚蠢的问题,或者不能正确地解释这个问题

我在做什么?

要请求一些URL(以快速异步方式或使用线程/多处理),请保存响应,对其中的某些内容进行grep并将其保存到文本文件中。使用bash可以很容易地完成,但是我希望它能够为将来的添加扩展,并学习python、python网络和多线程/处理的概念

我想出的工作代码:

import os
import subprocess
from multiprocessing.dummy import Pool as ThreadPool
import requests


def cit(urls):
        results = pool.map(requests.get, urls)
        pool.close()
        pool.join()
        return [result.text for result in results]
   

def to(urls):
    data = ' '.join(cit(urls))
    p2 = subprocess.run([<external-prog>], text=True, capture_output=True, input=data)
    p3 = subprocess.run([<another-external-prog>], text=True, capture_output=True, input=p2.stdout)

    with open('xyz.txt', 'w') as f:
        subprocess.run(['sort', '-u'], text=True, stdout=f, input=p3.stdout)

    co()


def co():
    with open('final.txt', 'w') as fs:
        subprocess.run(<external prog>)



if __name__ == '__main__':
    with open('urls.txt', 'r') as f:
        urls = f.read().splitlines()
    to(urls)
  

导入操作系统
导入子流程
从multiprocessing.dummy导入池作为线程池
导入请求
def cit(URL):
结果=pool.map(requests.get,URL)
pool.close()
pool.join()
return[result.text用于result in results]
def to(URL):
数据=''.join(cit(URL))
p2=子流程。运行([],text=True,capture\u output=True,input=data)
p3=子流程.run([],text=True,capture\u output=True,input=p2.stdout)
以open('xyz.txt','w')作为f:
subprocess.run(['sort','-u'],text=True,stdout=f,input=p3.stdout)
co()
def co():
打开('final.txt','w')作为fs:
subprocess.run()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
将open('url.txt','r')作为f:
URL=f.read().splitlines()
到(URL)
问题:

import os
import subprocess
from multiprocessing.dummy import Pool as ThreadPool
import requests


def cit(urls):
        results = pool.map(requests.get, urls)
        pool.close()
        pool.join()
        return [result.text for result in results]
   

def to(urls):
    data = ' '.join(cit(urls))
    p2 = subprocess.run([<external-prog>], text=True, capture_output=True, input=data)
    p3 = subprocess.run([<another-external-prog>], text=True, capture_output=True, input=p2.stdout)

    with open('xyz.txt', 'w') as f:
        subprocess.run(['sort', '-u'], text=True, stdout=f, input=p3.stdout)

    co()


def co():
    with open('final.txt', 'w') as fs:
        subprocess.run(<external prog>)



if __name__ == '__main__':
    with open('urls.txt', 'r') as f:
        urls = f.read().splitlines()
    to(urls)
  

  • 这是异步/并行请求URL的正确方法吗?我知道multiprocessing.dummy基本上是一个围绕线程的包装器,python中的线程只是执行上下文切换,由于GIL的原因而不是真正的并行。但我不知道在一个运行这些代码的系统中会有多少内核,所以我认为线程(控制用户运行多少线程)可能是更好的方法

  • 某些URL/链接可能不会返回200 OK,或者可能导致某些错误(引发任何异常),因此不会返回任何数据。我想忽略是否遇到任何这样的线程(或进程),直接跳到文件的下一行。我尝试了一些东西,但无法想出一个方法,而不添加一些for循环,这完全矛盾的POL.MAP函数,我正在使用的并行性(或并发,如果你考虑线程)。