9.4 微執行緒—stackless python
stackless python是python的乙個增強版本。stackless python修改了python的**,提供了對微執行緒的支援。微執行緒是輕量級的執行緒,與前邊所講的執行緒相比,微執行緒在多個執行緒間切換所需的時間更多,占用資源也更少。
9.4.1 stackless python概述
stackless python不是必需的,它只是python的乙個修改版本,對多執行緒程式設計有更好的支援。如果在對執行緒應用有較高的要求時可以考慮使用stackless python來完成。
1.stackless python安裝
(1)將壓縮包中的python25.dll及python25_d.dll複製到windows安裝目錄下的system32目錄中,替換原有的python25.dll及python25_d.dll。注意在替換前應將原始的檔案做好備份,以便在出現錯誤時恢復。
(2)將壓縮包中libs目錄中的檔案複製到python安裝目錄下的libs目錄中,替換原有的檔案。
(3)將壓縮包中lib目錄中的檔案複製到python安裝目錄下的lib目錄中,替換原有的檔案。
安裝完成後可以在python的交換式環境中輸入如下所示**。
import stackless
如果沒有錯誤產生,則表示stackless python已經安裝好了。若出現錯誤,則可能是stackless python與當前的python版本不相容,可以考慮使用其他版本的python。
2.stackless模組中的tasklet物件
stackless python提供了stackless內建模組。stackless模組中的tasklet物件完成了與建立執行緒類似的功能。使用tasklet物件可以像建立執行緒執行函式那樣來執行函式。以下例項使用tasklet物件的部分方法執行函式。
>>> import stackless # 匯入stackless模組
>>> def show(): # 定義show函式
... print 'stackless python'
...>>> st = stackless.tasklet(show)() # 呼叫tasklet新增函式,第2個括號為函式引數
>>> st.run() # 呼叫run方法,執行函式
stackless python
>>> st = stackless.tasklet(show)() # 重新生成st
>>> st.alive # 檢視其狀態
true
>>> st.kill() # 呼叫kill方法結束執行緒
>>> st.alive # 檢視其狀態
false
>>> stackless.tasklet(show)() # 直接呼叫tasklet
>>> stackless.tasklet(show)()
>>> stackless.run() # 呼叫模組的run方法
stackless python
stackless python
3.stackless模組中的schedule物件
stackless模組中的schedule物件可以控制任務的執行順序。當有多個任務時,可以使用schedule物件使其依次執行。如下**使用schedule物件控制任務順序。
>>> import stackless # 匯入stackless模組
>>> def show(): # 定義show函式
... stackless.schedule() # 使用schedule控制任務順序
... print 1
... stackless.schedule()
... print 2
...>>> stackless.tasklet(show)() # 呼叫tasklet,生成任務列表
>>> stackless.tasklet(show)()
>>> stackless.run() # 執行任務11
224.stackless模組中的channel物件
使用stackless模組中的channel物件可以在不同的人之間進行通訊,這和執行緒間的通訊類似。使用channel物件的send方法可以傳送資料。使用channel物件的receive方法可以接收資料。
>>> import stackless # 匯入stackless模組
>>> def send(): # 定義send方法
... chn.send('stackless python') # 呼叫channel物件的send方法傳送資料
... print 'i send: stackless python'
...>>> def rec(): # 定義rec方法
... print 'i receive:',chn.receive() # 呼叫channel物件的receive方法接收資料
...>>> stackless.tasklet(send)() # 呼叫tasklet,生成任務列表
>>> stackless.tasklet(rec)()
>>> stackless.run() # 執行任務
i receive: stackless python
i send: stackless python
9.4.2 使用微執行緒
使用stackless python的內建模組stackless也可以完成多執行緒程式設計,使用起來更加方便。以下s_p_c.py指令碼將前邊生產者與消費者的**改寫為stackless版,**更加簡潔。
# -*- coding:utf-8 -*-
# file: s_p_c.py
#import stackless # 匯入stackless模組
import queue # 匯入queue模組
def producer(i): # 定義生產者
global queue # 宣告為全域性queue物件
queue.put(i) # 向佇列中新增資料
print 'producer',i, 'add',i
def consumer(): # 定義消費者
global queue
i = queue.get() # 從佇列中取出資料
print 'consumer',i, 'get',i
queue = queue.queue() # 生成佇列物件
for i in range(10):
stackless.tasklet(producer)(i) # 新增生產者任務
for i in range(10):
stackless.tasklet(consumer)() # 新增消費者任務
stackless.run() # 執行任務
執行指令碼後輸出如下所示。
producer 0 add 0
producer 1 add 1
producer 2 add 2
producer 3 add 3
producer 4 add 4
producer 5 add 5
producer 6 add 6
producer 7 add 7
producer 8 add 8
producer 9 add 9
consumer 0 get 0
consumer 1 get 1
consumer 2 get 2
consumer 3 get 3
consumer 4 get 4
consumer 5 get 5
consumer 6 get 6
consumer 7 get 7
consumer 8 get 8
consumer 9 get 9
微博爬蟲python 微博爬蟲 python
本文爬取的是m站的微博內容,基於python 2.7 一 微博內容爬取 1.要爬取的微博首頁 2.手機微博是看不到翻頁,是一直往下載入的,但是其json格式的資料仍然以翻頁的形式呈現。3.開啟開發者工具,向下翻頁面,可以在network下的xhr的響應檔案中,找到json檔案的 如 通過分析發現每個...
python 微信爬蟲 python 微信爬蟲例項
import urllib.request import urllib.parse import urllib.error import re,time import queue import threading operner urllib.request.build opener operner...
python微信支付 微信支付 python版
需求 說明坑 簽名校驗通過時還是提示簽名錯誤,可能時候商戶號key配置的問題了,重置一下key,你可以繼續使用原來的key來重置 需要的id和key wpc 複製 流程簡介 那麼開發思路便是一步步回朔了.1.獲取code buy click function 複製 2.獲取openid classm...