ホームページ >バックエンド開発 >Python チュートリアル >Python でスレッド プールの map() メソッドを使用して複数パラメータのリストを渡す方法

Python でスレッド プールの map() メソッドを使用して複数パラメータのリストを渡す方法

WBOY
WBOY転載
2023-04-29 16:25:071645ブラウズ

スレッド プールの map() メソッドはマルチパラメータ リストを渡します

以前は、インターフェイスのマルチスレッド同時実行を容易にするために threading.thread() が使用されていましたが、これは、同時実行数が少ない場合 同時実行数が多い場合 スレッドパッケージコルーチンの処理方法以外に、スレッドプール方法も利用できます。

スレッド プールの実装は、平たく言えば、すべてのタスクをメッセージ キューに入れ、複数のスレッドを起動してから実行することですが、スレッドの実行が完了すると、スレッド タスクは実行されません。スレッド タスクはスレッド内で実行されるため、スレッド プールでは、マルチスレッド操作と比較してスレッドの作成と終了の多くの手順が節約され、ほとんどのリソースと時間が節約されます。

スレッド プールの同時実行にはモジュールの導入が必要です

import concurrent.futures

ThreadPoolExecutor スレッド プールのメソッドとしては、map() と submit() の 2 つがあります。今日は、map() メソッドについて話します

その構文

 with concurrent.futures.ThreadPoolExecutor() as pool:
      res = pool.map(craw, uid_list)
      print(res)
  • map() の場合、crawl はメソッド名であり、ここでのメソッド名には ()

  • は含まれません。
  • uid_list はメソッドのパラメータです。リストのデータ型は、map() メソッドで渡す必要があります。

次の内容を見てみましょう。最初にコード全体を紹介します

5000 ユーザー同時実行支援

    def test_case_09(self):
        """5000用户并发助力"""
        # 通过yaml配置文件封装方法 获取uid_list
        uid_list = YamlHandler(YamlThePath().number_new).get_uid_list()
        # add_ticket获取5000账号登陆状态
        with concurrent.futures.ThreadPoolExecutor() as pool:
            pool.map(AccountAccess().add_ticket, uid_list)
        # 5000账号线程池方法助力用户
        with concurrent.futures.ThreadPoolExecutor() as pool:
            pool.map(PreheatMethod().help, [(uid, self.A, 1) for uid in uid_list])
        # 获取用户被助力次数
        response = PreheatMethod().init(self.A)
        print(f"当前用户被助力次数 :{response['data']['userInfo']['helpedCount']}次")

理解を深めるために 2 つのインターフェイスのメソッドを見てみましょう

最初はログイン ステータスを取得することですadd_ticket

    def add_ticket(self, uid):
        """
        获取单独用户t票
        :param uid: 单独用户uid
        :return:
        """
        self.data['url'] = ApiAddress().get_ticket
        self.data['host'] = ApiAddress().host
        self.params['uid'] = str(uid)
        self.params['type'] = 0
        self.data['params'] = json.dumps(self.params)
        res = r().post(url=ApiAddress().ticket, data=self.data)
        print(f'获取t票结果:{uid}{res}')
        return uid

非常に単純なインターフェイスのリクエスト入力パラメータには uid が 1 つしかありませんが、注意してください。ここでの uid はリストではなく、単なるパラメータです。

次に、一部の学生が質問するでしょうが、map() で渡されるメソッド パラメータは、uid コンテンツのリストです。

map() メソッドは、必要なパラメータをリストに保存し、トラバーサルを通じて指定したインターフェイスを要求します。

私も当時同じ質問を自問したので、この時点で疑問に思う人もいるかもしれません。メソッドに複数のパラメータがあり、それらのパラメータの一部が固定コンテンツではない場合はどうなるでしょうか。

ヘルプ インターフェイスをリクエストする別の方法を見てみましょう

    def help(self, agrs):
        """
        助力用户
        :param agrs: uid:当前用户uid to_uid:助力用户uid count:助力次数
        :return:
        """
        uid, to_uid, count = agrs
        self.attrs['toUid'] = str(to_uid)
        self.attrs['count'] = count
        response = r().response(uid, self.code, "help", **self.attrs)
        logger.info(f'help response uid:{uid} to_uid:{to_uid}\n{response}')
        return response

はい、タプルを通じてヘルプ インターフェイスに渡し、指定されたキーワードの位置をタプルを通じて指定されたキーワードの位置に割り当てます。 . 要素の割り当て。

スレッド プールのコードでは、リスト導出を使用して、uid_list 内のパラメーターを指定したタプルに簡単に取り込みます。もちろん、ここに複数のパラメーターがある場合は、辞書を使用して、リスト内包表記ではリストが返されるため、変更パラメータとして辞書のキーと値を使用するため、必要なパラメータをタプルに入れ、タプルをリストに入れて、複数パラメータのメソッドにmap()を使用できるようにします。プールは同時です。

with concurrent.futures.ThreadPoolExecutor() as pool:
            pool.map(PreheatMethod().help, [(uid, self.A, 1) for uid in uid_list])
errree

リストの導出が得られると、おそらく以下のリスト データのコンテンツ形式になります。

Python でスレッド プールの map() メソッドを使用して複数パラメータのリストを渡す方法

以上がPython でスレッド プールの map() メソッドを使用して複数パラメータのリストを渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。