日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬虫的线程、进程、异步的基础讲解

發布時間:2023/12/16 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬虫的线程、进程、异步的基础讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線程和進程

1.進程是資源單位, 每一個進程至少要有一個線程
2.線程是執行單位
3.啟動每一個程序默認都會有一個主線程

# 線程, 進程 # 進程是資源單位, 每一個進程至少要有一個線程 # 線程是執行單位# 啟動每一個程序默認都會有一個主線程# def func(): # for i in range(1000): # print("func", i) # # # if __name__ == '__main__': # func() # for i in range(1000): # print("main", i)# 多線程, 創建一個線程類 from threading import Thread# def func(): # for i in range(1000): # print("func", i) # # # if __name__ == '__main__': # t = Thread(target=func) # 創建線程并給線程安排任務 # t.start() # 多線程狀態為可以開始工作狀態, 具體的執行時間由CPU決定 # # for i in range(1000): # print("main", i)class MyThread(Thread):# 這個函數是固定的, 當線程被執行的時候, 被執行的就是run()def run(self):for i in range(1000):print("子線程", i)if __name__ == '__main__':t = MyThread()# t.run() # 方法的調用了. -> 單線程# 開啟線程t.start()for i in range(1000):print("主線程", i)

多進程的基礎代碼

# 多進程的代碼基礎 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爬虫的线程、进程、异步的基础讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。