Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie die Thread-Pool-Map()-Methode in Python, um eine Liste mit mehreren Parametern zu übergeben

So verwenden Sie die Thread-Pool-Map()-Methode in Python, um eine Liste mit mehreren Parametern zu übergeben

WBOY
WBOYnach vorne
2023-04-29 16:25:071620Durchsuche

Die Thread-Pool-Map()-Methode übergibt eine Liste mit mehreren Parametern

Früher wurde threading.thread() verwendet, um die Multithread-Parallelität der Schnittstelle zu erleichtern. Dies ist jedoch nützlicher, wenn die Anzahl der Parallelitäten gering ist Die Anzahl der Parallelitäten ist groß. Zusätzlich zum Thread-Paket können wir bei der Coroutine-Verarbeitung auch die Thread-Pool-Methode verwenden.

Laienhaft ausgedrückt besteht die Implementierung des Thread-Pools darin, alle Aufgaben in die Nachrichtenwarteschlange zu stellen, mehrere Threads zu starten und dann den Thread auszuführen. Nach Abschluss der Thread-Ausführung wird die Thread-Aufgabe jedoch nicht unterbrochen Die Thread-Aufgabe wird weiterhin zur Thread-Ausführung aus der Nachrichtenwarteschlange abgerufen, sodass der Thread-Pool im Vergleich zu Multithread-Vorgängen viele Schritte zum Erstellen und Schließen von Threads einspart, wodurch die meisten Ressourcen und Zeit gespart werden.

Thread-Pool-Parallelität erfordert die Einführung von Modulen

import concurrent.futures

ThreadPoolExecutor. Es gibt zwei Thread-Pool-Methoden: Map() und Submit(). Heute werden wir zuerst über die Map()-Methode sprechen. Seine Syntax lautet:

 with concurrent.futures.ThreadPoolExecutor() as pool:
      res = pool.map(craw, uid_list)
      print(res)
map() Der darin enthaltene Methodenname enthält nicht ()

  • uid_list ist der Methodenparameter, der benötigt wird in der Map()-Methode übergeben werden

    map()内craw为方法名,这里方法命不带()

  • uid_list

  • Werfen wir zuerst einen Blick auf den Gesamtcode

5000 Benutzer-Parallelitätsunterstützung

    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']}次")

Werfen wir einen Blick auf die Methoden der beiden Schnittstellen, um ein besseres Gefühl zu bekommen

Das erste ist Um den Anmeldestatus zu erhalten, 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

Eine sehr einfache Schnittstellenanforderung hat nur einen UID-Parameter, aber achten Sie darauf, dass die UID hier keine Liste ist, sondern nur ein Parameter.

Einige Schüler werden Fragen haben. Der in map() übergebene Methodenparameter ist eine Liste von UID-Inhalten. Die Methode

map () dient dazu, die benötigten Parameter in der Liste zu speichern und die von Ihnen angegebene Schnittstelle durch Durchqueren anzufordern.

Einige Leute fragen sich zu diesem Zeitpunkt vielleicht, weil ich mir damals die gleiche Frage gestellt habe: Was wäre, wenn eine Methode mehrere Parameter enthält und einige dieser Parameter nicht einmal festen Inhalt haben?

Werfen wir einen Blick auf eine andere Methode zum Anfordern der Hilfeschnittstelle

    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

Ja, wir übergeben sie über Tupel an die Hilfeschnittstelle und weisen den angegebenen Elementen über die Schlüsselwortpositionen im Tupel Werte zu.

Im Code des Thread-Pools verwenden wir die Listenableitung, um die Parameter in uid_list in das von Ihnen angegebene Tupel zu integrieren. Wenn hier mehrere Parameter vorhanden sind, können Sie natürlich auch ein Wörterbuch verwenden und das Wörterbuch zur Erleichterung des Schlüssels verwenden und Wert. Ändern von Parametern, da das Listenverständnis eine Liste zurückgibt, also fügen wir die erforderlichen Parameter in das Tupel und das Tupel in die Liste ein, damit wir den Map()-Thread-Pool für Methoden mit mehreren Parametern für die Parallelität verwenden können . .

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

Nachdem die Listenableitung erhalten wurde, handelt es sich wahrscheinlich um das folgende Listendateninhaltsformat

Das obige ist der detaillierte Inhalt vonSo verwenden Sie die Thread-Pool-Map()-Methode in Python, um eine Liste mit mehreren Parametern zu übergeben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen