python爬虫的线程、进程、异步的基础讲解
生活随笔
收集整理的這篇文章主要介紹了
python爬虫的线程、进程、异步的基础讲解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
線程和進程
1.進程是資源單位, 每一個進程至少要有一個線程
2.線程是執行單位
3.啟動每一個程序默認都會有一個主線程
多進程的基礎代碼
# 多進程的代碼基礎 from multiprocessing import Process from threading import Thread# def func(): # for i in range(1000): # print("子進程", i) # # # if __name__ == '__main__': # p = Process(target=func) # p.start() # for i in range(1000): # print("主進程", i)def func(name):for i in range(1000):print(name, i)if __name__ == '__main__':t1 = Thread(target=func, args=("周杰林",))t1.start()for i in range(1000):print(i)t2 = Thread(target=func, args=("王力宏",))t2.start()線程池和進程池的基礎
# 線程池和進程池的基礎 from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutordef fn(name):for i in range(1000):print(name, i)if __name__ == '__main__':# 創建線程池with ThreadPoolExecutor(50) as t:for i in range(100):t.submit(fn, name=f"線程{i}\n")# 等待線程池中的任務全部執行完畢。 才能繼續執行(守護)print("123")異步的導入
# import time # # # def func(): # print("我愛黎明") # time.sleep(3) # 讓當前的線程處于阻塞狀態. CPU是不為我工作的 # print("我真的愛黎明") # # # if __name__ == '__main__': # func() # # """ # # input() 程序也是處于阻塞狀態 # # requests.get(bilibili) 在網絡請求返回數據之前, 程序也是處于阻塞狀態的 # # 一般情況下, 當程序處于 IO操作的時候. 線程都會處于阻塞狀態 # # # 協程: 當程序遇見了IO操作的時候. 可以選擇性的切換到其他任務上. # # 在微觀上是一個任務一個任務的進行切換. 切換條件一般就是IO操作 # # 在宏觀上,我們能看到的其實是多個任務一起在執行 # # 多任務異步操作 # # # 上方所講的一切. 都是在單線程的條件下 # """# python編寫協程的程序 # 導入異步操作的包 import asyncio import time# async def func(): # print("你好啊, 我叫賽利亞") # # # if __name__ == '__main__': # g = func() # 此時的函數是異步協程函數. 此時函數執行得到的是一個協程對象 # # print(g) # asyncio.run(g) # 協程程序運行需要asyncio模塊的支持# async def func1(): # print("你好啊, 我叫潘金蓮") # # time.sleep(3) # 當程序出現了同步操作的時候. 異步就中斷了 # await asyncio.sleep(3) # 異步操作的代碼 # print("你好啊, 我叫潘金蓮") # # # async def func2(): # print("你好啊, 我叫王建國") # # time.sleep(2) # await asyncio.sleep(2) # print("你好啊, 我叫王建國") # # # async def func3(): # print("你好啊, 我叫李雪琴") # await asyncio.sleep(4) # print("你好啊, 我叫李雪琴") # # # if __name__ == '__main__': # f1 = func1() # f2 = func2() # f3 = func3() # tasks = [ # f1, f2, f3 # ] # t1 = time.time() # # 一次性啟動多個任務(協程) # asyncio.run(asyncio.wait(tasks)) # t2 = time.time() # print(t2 - t1)async def func1():print("你好啊, 我叫潘金蓮")await asyncio.sleep(3)print("你好啊, 我叫潘金蓮")async def func2():print("你好啊, 我叫王建國")await asyncio.sleep(2)print("你好啊, 我叫王建國")async def func3():print("你好啊, 我叫李雪琴")await asyncio.sleep(4)print("你好啊, 我叫李雪琴")async def main():# 第一種寫法# f1 = func1()# await f1 # 一般await掛起操作放在協程對象前面# 第二種寫法(推薦)tasks = [# py3.8以后加上asyncio.create_task()asyncio.create_task(func1()),asyncio.create_task(func2()),asyncio.create_task(func3())]await asyncio.wait(tasks)if __name__ == '__main__':t1 = time.time()# 一次性啟動多個任務(協程)asyncio.run(main())t2 = time.time()print(t2 - t1)# # 在爬蟲領域的應用 # async def download(url): # print("準備開始下載") # await asyncio.sleep(2) # 網絡請求 requests.get() # print("下載完成") # # # async def main(): # urls = [ # "http://www.baidu.com", # "http://www.bilibili.com", # "http://www.163.com" # ] # # # 準備異步協程對象列表 # tasks = [] # for url in urls: # d = asycio.create_task(download(url)) # tasks.append(d) # # # tasks = [asyncio.create_task(download(url)) for url in urls] # 這么干也行哦~ # # # 一次性把所有任務都執行 # await asyncio.wait(tasks) # # if __name__ == '__main__': # asyncio.run(main())項目實戰
# requests.get() 同步的代碼 -> 異步操作aiohttp # pip install aiohttpimport asyncio import aiohttpurls = ["http://kr.shanghai-jiuxin.com/file/2020/1031/191468637cab2f0206f7d1d9b175ac81.jpg","http://kr.shanghai-jiuxin.com/file/2020/1031/563337d07af599a9ea64e620729f367e.jpg","http://kr.shanghai-jiuxin.com/file/2020/1031/774218be86d832f359637ab120eba52d.jpg" ]async def aiodownload(url):# 發送請求.# 得到圖片內容# 保存到文件# rsplit()函數是第一個參數從右面開始進行切割,最后是一個列表的格式name = url.rsplit("/", 1)[1]async with aiohttp.ClientSession() as session:# resp = requests.get()# 可以自己去學習一個模塊, aiofilesasync with session.get(url) as resp:# 創建文件with open(name, mode="wb") as f:# 讀取內容是異步的. 需要await掛起, resp.text()f.write(await resp.content.read())print(name, "搞定")async def main():tasks = []for url in urls:tasks.append(aiodownload(url))await asyncio.wait(tasks)if __name__ == '__main__':# asyncio.run(main())# 會有如下的問題# raise RuntimeError('Event loop is closed')# RuntimeError: Event loop is closed# Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x000002712CEB0EE0>loop = asyncio.get_event_loop()loop.run_until_complete(main())總結
以上是生活随笔為你收集整理的python爬虫的线程、进程、异步的基础讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [php]-MVC
- 下一篇: python编写直角三角形边长公式_py