マルチスレッドとマルチプロセッシングを使用するときにjupyterが恐れることができないエラー報告の問題を解決し、tqdmを使用して進行状況バーを表示します

最近、職場でクローラーのデモンストレーションを実行する必要があります。インターフェイスでアカウントとパスワードを入力してから、データのクロールを開始する必要があります。クロール速度を上げるには、マルチプロセスクローラーを使用する必要があります。これまであまり多くのプロセスを使用したことはありません。Pycharmは実行できますが、 jupyterで実行する必要があるため(Pycharmはgetpassを使用して入力を非表示にすることはできません)、今日コードを作成するときに多くの問題が発生しました。ここに要約を示します。

pythonバージョン
3.7.6jupyterlabバージョン1.2.6

①jupyternotebook/ labで直接複数のプロセスを使用する場合、インターフェースでエラーは発生しませんが、常に実行されます。コマンドラインを確認すると、次のエラーが表示されます。AttributeError
:<module 'で属性「XXX 」を取得できませんmain '>、プールは、何らかの理由で、インポートされたモジュールで定義されていないオブジェクトを常に使用できるとは限りません。
②実行時にエラーが報告されます:
AttributeError:モジュール 'main'に属性 'spec'がない場合、名前== ' main ':
spec =“ ModuleSpec(name = 'builtins'、loader = <class ']の下に追加する必要があります_frozen_importlib.BuiltinImporter '>)」

Jupyterはメインプロセスのみを追跡でき、子プロセスは追跡できません。インターネット上には他にもいくつかの解決策がありますが、コードをpyファイルにパッケージ化してから、jupyterにこのファイルを実行させるのが最も簡単な方法だと思います。コードは次のとおりです。

クローラーはCookieを取得するためにアカウントとパスワードを入力する必要があるため、テスト用にアカウントを入力し、それをワーカー関数とメイン関数に渡して、正常に実行できるかどうかを確認する関数を次に示します。

%%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)

上記のコードを実行すると、デフォルトのパスに.pyファイルが生成され、
ここに写真の説明を挿入
次の1つが実行されます。

%run test.py

ここに写真の説明を挿入
それでおしまい!

おすすめ

転載: blog.csdn.net/weixin_43785299/article/details/109301646