python 微執行緒

2021-08-22 20:29:44 字數 3799 閱讀 7680

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...