python-2.7 - 在 Python 中使用多处理和请求并行发布请求

标签 python-2.7 parallel-processing multiprocessing python-requests grequests

我有如下小代码片段:

import requests
import multiprocessing

header = {
'X-Location': 'UNKNOWN',
'X-AppVersion': '2.20.0',
'X-UniqueId': '2397123',
'X-User-Locale': 'en',
'X-Platform': 'Android',
'X-AppId': 'com.my_app',
'Accept-Language': 'en-ID',
'X-PushTokenType': 'GCM',
'X-DeviceToken': 'some_device_token'
}


BASE_URI = 'https://my_server.com/v2/customers/login'

def internet_resource_getter(post_data):
    stuff_got = []

    response = requests.post(BASE_URI, headers=header, json=post_data)
    stuff_got.append(response.json())

    return stuff_got

tokens = [{"my_token":'EAAOZAe8Q2rKYBAu0XETMiCZC0EYAddz4Muk6Luh300PGwGAMh26Bpw3AA6srcxbPWSTATpTLmvhzkUHuercNlZC1vDfL9Kmw3pyoQfpyP2t7NzPAOMCbmCAH6ftXe4bDc4dXgjizqnudfM0D346rrEQot5H0esW3RHGf8ZBRVfTtX8yR0NppfU5LfzNPqlAem9M5ZC8lbFlzKpZAZBOxsaz'},{"my_token":'EAAOZAe8Q2rKYBAKQetLqFwoTM2maZBOMUZA2w5mLmYQi1GpKFGZAxZCaRjv09IfAxxK1amZBE3ab25KzL4Bo9xvubiTkRriGhuivinYBkZAwQpnMZC99CR2FOqbNMmZBvLjZBW7xv6BwSTu3sledpLSGQvPIZBKmTv3930dBH8lazZCs3q0Q5i9CZC8mf8kYeamV9DED1nsg5PQZDZD'}]

pool = multiprocessing.Pool(processes=3)
pool_outputs = pool.map(internet_resource_getter, tokens)
pool.close()
pool.join()

我想做的就是向终点发出并行 POST 请求,而每个 POST 都会有一个不同的 token ,因为它是帖子正文。

  1. 通过上述内容我能实现我想要的目标吗?我得到了输出,但不确定我的请求是否是并行发送的。
  2. 我知道有人提出请求。我想实现真正的并行请求(就像在我的系统上利用多个处理器一样),因此我选择了多处理而不是 grequests(据我所知,它使用 gevents,它又不是并行的,而是多线程的)。我的理解正确吗?

最佳答案

如果您对并行执行多个 POST 请求感兴趣,我建议您使用 asyncioaiohttp ,它们都实现了并行运行的异步任务的思想。

例如,您可以使用 asyncio 执行类似的操作:

import requests
import asyncio

header = {
    'X-Location': 'UNKNOWN',
    'X-AppVersion': '2.20.0',
    'X-UniqueId': '2397123',
    'X-User-Locale': 'en',
    'X-Platform': 'Android',
    'X-AppId': 'com.my_app',
    'Accept-Language': 'en-ID',
    'X-PushTokenType': 'GCM',
    'X-DeviceToken': 'some_device_token'
}

BASE_URI = 'https://my_server.com/v2/customers/login'


def internet_resource_getter(post_data):
    stuff_got = []

    response = requests.post(BASE_URI, headers=header, json=post_data)

    stuff_got.append(response.json())
    print(stuff_got)
    return stuff_got

tokens = [
    {
        "my_token": 'EAAOZAe8Q2rKYBAu0XETMiCZC0EYAddz4Muk6Luh300PGwGAMh26B'
                    'pw3AA6srcxbPWSTATpTLmvhzkUHuercNlZC1vDfL9Kmw3pyoQfpyP'
                    '2t7NzPAOMCbmCAH6ftXe4bDc4dXgjizqnudfM0D346rrEQot5H0es'
                    'W3RHGf8ZBRVfTtX8yR0NppfU5LfzNPqlAem9M5ZC8lbFlzKpZAZBO'
                    'xsaz'
     },
    {
        "my_token": 'EAAOZAe8Q2rKYBAKQetLqFwoTM2maZBOMUZA2w5mLmYQi1GpKFGZAx'
                    'ZCaRjv09IfAxxK1amZBE3ab25KzL4Bo9xvubiTkRriGhuivinYBkZA'
                    'wQpnMZC99CR2FOqbNMmZBvLjZBW7xv6BwSTu3sledpLSGQvPIZBKmT'
                    'v3930dBH8lazZCs3q0Q5i9CZC8mf8kYeamV9DED1nsg5PQZDZD'
     }
]

loop = asyncio.get_event_loop()

for token in tokens:
    loop.run_in_executor(None, internet_resource_getter, token)

请注意:它们仅存在于 python 3.x 中。但是,在我看来,它看起来更好、更简洁,并且确保它们并行运行。

关于python-2.7 - 在 Python 中使用多处理和请求并行发布请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43448042/

相关文章:

python - 使用 json.dumps() 时出现 UnicodeDecodeError

java - Java实际上是否并行运行线程

multithreading - Foreach 对象比 foreach -parallel 更快?

c++ - 如何优化矩阵乘法 (matmul) 代码以在单个处理器内核上快速运行

python、多处理和 dmtcp : checkpointing one process in Pool?

python - 使用 Python 进行 Google 搜索网页抓取

Python subprocess.communicate() 不捕获简单二进制文件的输出

python - 如何为我的主窗口设置最小和最大调整大小?

加入的 Python 进程不会调用 atexit

python - 如何在 for 循环中使用多重处理?如何让一个核心运行从索引n1到n2的循环,另一个核心从索引n2到n3运行循环?