一、寫在前面
二、知識補充
1.class celery.group
group這個類表示建立一組要並行執行的任務,不過一組任務是懶惰的,所以你需要執行並對其進行評估。要了解這個類,可以檢視文件,或者在pycharm中直接ctrl+左鍵就能直接檢視原始碼了,如下圖:
python資源共享群:626017123
當然了,直接看原始碼還不夠,最好還是自己動下手。所以先建立乙個test.py,其中**如下:
1 from celery import celery然後執行celery伺服器,再在test.py所在目錄下建立乙個test_run.py用於測試,其中**如下:2 3
5 6
8 def add(x, y):
9 return x + y
10 11
12 if __name__ == '__main__':
1 from celery import group在pycharm中執行test_run.py,得到的結果如下:2 from .test import add
3 4
5 lazy_group = group(add.s(2, 2), add.s(4, 4))
6 print(type(lazy_group))
7 result = lazy_group()
8 print(result)
9 print(type(result))
10 print(result.get())
fe54f453-eb9c-4b24-87e3-a26fab75967f通過檢視原始碼可以知道,是可以往group中傳入乙個由任務組成的可迭代物件的,所以這就進行一下測試,對上面的**進行一點修改:[4, 8]
1 from celery import group執行之後得到了我們想要的結果:2 from celeryspider.test import add
3 4
5 lazy_group = group(add.s(x, y) for x, y in zip([1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))
6 result = lazy_group()
7 print(result)
8 print(result.get())
f03387f1-af00-400b-b58a-37901563251d2.celer.result.collect()[3, 7, 11, 15, 19]
在celery中有乙個類result,這個類包含了任務執行的結果和狀態等,而在這個類中就有乙個collect()方法,使用該方法能在結果返回時收集結果。和之前一樣的步驟,先看看原始碼:
1 from celery import celery, group, result2 3
5 6
8 def a(how_many):
9 return group(b.s(i) for i in range(how_many))()
10 11
13 def b(i):
14 return pow2.delay(i)
15 16
18 def pow2(i):
19 return i ** 2
20 21
22 if __name__ == '__main__':
三、具體步驟
1.專案結構
2.主要**
1 from celery import celery下面是tasks.py中的**,其中包含了傳送請求和解析網頁的**:2 3
5 # 匯入配置檔案
7 8
9 if __name__ == '__main__':
1 import requests最後是crawl.py中的**:2 from lxml import etree
3 from celery import group
5 6
7 headers =
12 13
15 def main(urls):
16 # 主函式
17 return group(call.s(url) for url in urls)()
18 19
21 def call(url):
22 # 傳送請求
23 try:
24 res = requests.get(url, headers=headers)
25 parse.delay(res.text)
26 except exception as e:
27 print(e)
28 29
31 def parse(html):
32 # 解析網頁
33 et = etree.html(html)
34 href_list = et.xpath('//*[@id="home"]/div/div[2]/a/@href')
35 result =
36 for href in href_list:
37 href_res = requests.get(href, headers=headers)
38 href_et = etree.html(href_res.text)
39 src_list = href_et.xpath('//*[@class="artile_des"]/table/tbody/tr/td/a/img/@src')
40 result.extend(src_list)
41 return result
1 import time四、執行結果2 from celeryspider.tasks import main
3 4
5 start_time = time.time()
6 7
8 url_list = ["".format(i) for i in range(1, 31)]
9 res = main.delay(url_list)
10 all_src =
11 for i in res.collect():
12 if isinstance(i[1], list) and isinstance(i[1][0], str):
13 all_src.extend(i[1])
14 15 print("src count: ", len(all_src))
16 17
18 end_time = time.time()
19 print("cost time: ", end_time - start_time)
當執行celery服務後,再執行crawl.py檔案,會看到如下資訊列印出來:
這樣求極限 洛就完事了!
再求極限的過程中,有一種很方便的方法叫洛必達法則。可能有的同學高中就接觸過這種方法。但是洛必達法則並不是洛必達發現的,我們先來講講洛必達法則的 1661年洛必達出生於法國的貴族家庭。1704年2月2日卒於巴黎。他曾受襲侯爵銜,並在軍隊中擔任騎兵軍官,後來因為視力不佳而退出軍隊,轉向學術方面加以研究。...
2016就快結束了
粗粗想來記憶竟是如此模糊,猛的一想,又是那麼清晰。而我還是那個我。階段1 北京洛陽兩地跑 1月到五月初 那我開始想到的是元旦,那時應該還在學校準備考試。哈哈,時間過得很快。然後在北京和洛陽兩地來回的跑。還是蠻不錯的經歷。那個後台系統也完成,不過當時還是太過於年少,竟然沒有總結,也導致了後來跳槽找工作...
萬事開頭難,幹就完事兒了
總結今天在學習c語言巨集定義的時候發現了乙個問題。定義是這樣的 define sum a,b a b define sharp a,b a b 我們都知道c c 的巨集定義僅僅是進行字元替換。1.sum a,b 會將代入,然後求和 2.sharp a,b 會將a b組合在一起,成為乙個字串 然後進行...