ホームページ  >  に質問  >  本文

python 2.7 如何实现http post多并发?

注意是python 2.7, (multiprocessing值支持到2.6,2.7下安装会报错)

用threadpool试了一下,总是报错:

单次并发的函数

data = ['a', 'b', 'c']
#data传到threadpool.makeRequests里面的第二个参数,函数会将这个列表里面的值取出来,然后根据并发数进行并发。
def repost(data):
    response = requests.post(url, data).text
    return response

结果处理函数,只是打印出来

def postresult(requestself, responseresult):
    print(responseresult)
    #其他的处理,比如对结果插入到数据库,或者写入日志等,可以在这里写

pool = threadpool.ThreadPool(5)
requests = threadpool.makeRequests(repost, data, postresult)
**#之前出问题,是因为这里requests的名称定义和requests()方法冲突了。。。然后报错又很奇怪,没引起注意,把这里的requests改个名字就OK了。各位,承让了。
当然,下面这一样,也改一下。requests的名称。
[pool.putRequest(req) for req in requests]
pool.wait()

报错如下:

Traceback (most recent call last):
  File "C:\User\AppData\Local\Programs\Python\Python35-32\lib\site-packages\threadpool.py", line 158, in run
    result = request.callable(*request.args, **request.kwds)
  File "C:\test.py", line 29, in repost
    response = requests.post(url, data1).text
AttributeError: 'list' object has no attribute 'post'

或者有没有其他实现方法?

我靠,我靠,我靠靠靠。。。。问题解决了。看上面的备注。再见。

PHP中文网PHP中文网2740日前950

全員に返信(2)返信します

  • 阿神

    阿神2017-04-18 10:20:50

    まず、test.py 全体を貼り付けます。エラー メッセージから、リクエスト変数が上書きされ、リクエストがリスト型になっているはずです。

    Python の特性上、マルチスレッドを使用しても同時に実行できる命令は 1 つだけであり、マルチスレッドのパフォーマンス向上には限界があります。

    まずネットワークを非同期にしてから、基本的な ioloop を実装する必要があります。また、asyncio または Tornado に基づいてシングルスレッドのマルチ同時実行を実装することもできます。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:20:50

    2.7 には asyncio がありません。gevent などを使用できます。マルチプロセスを備えた 2.7 は数十ありますが、あなたのものは IO 集約的であり、複数のプロセスを使用するのは逆効果です。コルーチンの実装にはサードパーティのライブラリを使用してください。

    返事
    0
  • キャンセル返事