以前は、インターフェイスのマルチスレッド同時実行を容易にするために 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])
リストの導出が得られると、おそらく以下のリスト データのコンテンツ形式になります。
以上がPython でスレッド プールの map() メソッドを使用して複数パラメータのリストを渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。