import multiprocessing
from multiprocessing import Semaphore
import time
import asyncio
import aiohttp
import requests
import random,time, datetime
import utils
import json
def start_loop(turn):
request_url = '
https://www.baidu.com'
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
tasks = []
for num in range(2000):
func = aio_request(request_url,turn,loop)
task = asyncio.ensure_future(func)
tasks.append(task)
try:
ret = loop.run_until_complete(asyncio.gather(*tasks))
loop.close()
except Exception as e:
print('loop 中断或者完成',e)
return turn
async def aio_request(url,headers,turn,loop):
async with aiohttp.ClientSession() as s:
async with await s.get(url) as response:
print('请求内容', url)
# response.read()二进制(.content )
result = await response.json()
print(url, '获取内容完成')
def main():
start = time.time()
pool = multiprocessing.Pool(processes = 30)
for turn in range(10):
pool.apply_async(start_loop, (turn, ))
pool.close()
pool.join()
print('总耗时:',time.time()-start)
if __name__ == "__main__":
main()
这是个简单例子。主要逻辑是,多进程跑协程任务,协程处理并发 2000 个地址以上。奇怪的地方在于,我这个例子也能跑,但放到项目里就卡死。而且并发 20 能跑,2000 就卡死。把这个协程单独运行(非进程内)也可以跑,不知道是不是阻塞了。之前实在没并发编程经验,不知道算不算很低级的错误。。。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/748977
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.