在返回值之前等待所有函数返回

2024-04-25 14:21:20 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个函数,比如:

def func1():
    return int(requests.get('https://www.random.org/integers/?num=1&min=0&max=10&col=1&base=10&format=plain&rnd=new').text)

我想调用这个函数三次,对响应求和,然后返回平方和或者一些简单的东西。我如何做到这一点,使三个函数调用是异步的,但它等待它们全部返回,一个la答应我。好的在Javascript中?你知道吗

我正在使用python2。你知道吗


Tags: integers函数httpsorggetreturndefwww
3条回答

为此,您需要使用线程,最简单的方法是通过multiprocessing.pool.ThreadPool包(不要让它欺骗您,尽管它在包中,但它不是多处理的):

import requests
from multiprocessing.pool import ThreadPool

# let's make it a bit more flexible
RANDOM_URL = 'https://www.random.org/integers/'
RANDOM_PARAMS = {"num": 1, "min": 0, "max": 10, "col": 1, "base": 10,
                 "format": "plain", "rnd": "new"}

def func1(*args):  # args added to account for the dummy payload from pool.map
    return int(requests.get(RANDOM_URL, params=RANDOM_PARAMS).text)

pool = ThreadPool(processes=3)
response_sum = sum(pool.map(func1, range(3)))
print("Squared response: {}".format(response_sum**2))

出于您的目的,我对函数进行了一些修改:

def func1():
    page = requests.get('https://www.random.org/integers/?num=1&min=0&max=10&col=1&base=10&format=plain&rnd=new').text
    num = extract_num(page) # Any parsing function that extracts the number and converts it to an integer type.
    cumulative += num # Sums up

然后,使用线程:

import threading

cumulative = 0

for i in range(3): # Gets random numbers asynchronously.
    threading.Thread(target=func1).start()
print cumulative

根据您的喜好,如果您同意安装第三方后端口模块https://pypi.python.org/pypi/futures,您还可以使用concurrent.futures作为更高级别的接口,以避免处理线程,并使用与您在问题中提到的承诺/未来更相似的API:

from concurrent.futures import ThreadPoolExecutor
import requests

def func1():
    return int(requests.get('https://www.random.org/integers/?num=1&min=0&max=10&col=1&base=10&format=plain&rnd=new').text)

ex = ThreadPoolExecutor()
f1 = ex.submit(func1)
f2 = ex.submit(func1)
f3 = ex.submit(func1)

print(f1.result(), f2.result(), f3.result())

相关问题 更多 >