Resuelva el problema de informes de errores que jupyter no puede temer cuando usa multiproceso y multiprocesamiento, y use tqdm para mostrar la barra de progreso

Recientemente, necesito realizar una demostración del rastreador en el trabajo. Debes ingresar tu cuenta y contraseña en la interfaz, y luego comenzar a rastrear datos. Necesitas usar un rastreador multiproceso para acelerar la velocidad de rastreo. No he usado demasiados procesos antes. Pycharm puede ejecutarse, pero Debe ejecutarse en jupyter (Pycharm no puede usar getpass para ocultar la entrada), así que encontré muchos problemas al escribir código hoy, aquí hay un resumen.

Python versión 3.7.6
jupyter lab versión 1.2.6

① Si usa varios procesos directamente en jupyter notebook / lab, aunque no habrá ningún error en la interfaz, siempre estará ejecutándose. Si marca la línea de comando, verá un error:
AttributeError: No se puede obtener el atributo 'XXX' en <módulo ' main '>, Pool no siempre puede usar objetos no definidos en el módulo importado por alguna razón.
②Se informa un error durante el tiempo de ejecución:
AttributeError: module'main 'no tiene atributo'spec', luego debe agregar debajo de if name == ' main ':
spec = “ModuleSpec (name = 'builtins', loader = <class ' _frozen_importlib.BuiltinImporter '>) ”

Jupyter solo puede rastrear el proceso principal, no el proceso hijo. Hay algunas otras soluciones en Internet, pero creo que la forma más fácil es empaquetar el código en un archivo py, y luego dejar que jupyter ejecute este archivo. El código es el siguiente:

Debido a que el rastreador necesita ingresar la cuenta y la contraseña para obtener la cookie, aquí hay una función para ingresar a la cuenta para la prueba y luego pasarla al trabajador y a las funciones principales para ver si puede ejecutarse normalmente.

%%writefile  test.py
import os,time
from multiprocessing import Pool
from tqdm import tqdm
import getpass
import time
def user_info():
    user = input('请输入用户名:')
    psw = getpass.getpass('请输入密码:')#隐藏密码
    return user,psw
    
def worker(x,user,psw):
    return x*x
    
def main(user,psw):
    lst = []
    print("主进程开始执行>>> pid={}".format(os.getpid()))
    ps=Pool(processes=12)
    with tqdm(total=len(range(500))) as t:
        for i in range(500):
            res = ps.apply_async(worker,args=(i,user,psw)) # 异步执行,args为传入的参数
            print(i)
            t.update()
            time.sleep(0.1)
        # 关闭进程池,停止接受其它
        ps.close()
        # 阻塞进程
        ps.join()
        print("主进程终止")
if __name__ == '__main__':
    user,psw = user_info()
    print(user)
    __spec__ = "ModuleSpec(name='builtins', loader=<class '_frozen_importlib.BuiltinImporter'>)"#
    main(user,psw)

La ejecución del código anterior generará un archivo .py en la ruta predeterminada
Inserte la descripción de la imagen aquí
y luego ejecutará uno:

%run test.py

Inserte la descripción de la imagen aquí
¡Eso es!

Supongo que te gusta

Origin blog.csdn.net/weixin_43785299/article/details/109301646
Recomendado
Clasificación