作業系統中,程序是資源分配的基本單位,執行緒是pu排程(程式執行)的最小單位。計算機執行程式必須分配資源(記憶體,有堆、棧、自右儲存區、全域性/靜態變數區、資料區)
關於多執行緒的介紹,這不再闡述,請見python內建函式thread
# encoding:utf-8
# 多執行緒測試
import time
import threading
def test_thread(para='hi',sleep=3):
time.sleep(sleep)
j = 1
for i in range(10000):
j += 1
print(j)
def main():
# 建立執行緒
print('啟動執行緒.....')
thread_hi = threading.thread(target=test_thread)
thread_hello = threading.thread(target=test_thread,args=('hello',1))
# 啟動執行緒
thread_hi.start()
thread_hello.start()
print('main thread has ended!')
if __name__ == '__main__':
t1 = time.time()
main()
print(time.time() - t1)
print('不使用執行緒...')
t2 = time.time()
test_thread()
print(time.time() - t2)
具體案例:
cnews下存在14個型別的新聞資料,每個類別下有一系列的新聞文字內容。現需將所有的新聞資料按照 型別+tab+文字內容存放在txt檔案中。據統計,cnews下每個型別的新聞有如下圖的檔案數目。
多執行緒處理這些檔案,並儲存為train,dev,test三檔案形式,其**如下:
# encoding:utf-8
import os
import random
import time
import threading
def getpath(path='cnews'):
return os.path.abspath(os.path.dirname('__file__')) + os.path.sep + path
def labelfileorg(num=2000):
cnews_label = ['cnews\\' + ch for ch in os.listdir(getpath('cnews')) if '\u4e00' <= ch <= '\u9fff'] # 判斷ch是否為中文
cnew_label_file = dict()
for ch in cnews_label:
print('新聞型別:',ch)
file_list = os.listdir(getpath(ch))
random.shuffle(file_list)
cnew_label_file[ch] = file_list[:num]
for file_name in file_list[:int(num * 0.7)]:
writefile(ch,getpath(ch + '\\' + file_name))
for file_name in file_list[int(num * 0.7 + 1):int(num * 0.9)]:
writefile(ch,getpath(ch + '\\' + file_name),'cnews\\cnews.dev.txt')
for file_name in file_list[int(num * 0.9 + 1):num]:
writefile(ch,getpath(ch + '\\' + file_name),'cnews\\cnews.test.txt')
def writefile(ch,filename,path='cnews\\cnews.train.txt'):
with open(filename,'rb') as fp:
text = ' '.join([line.decode().strip('\n') for line in fp.readlines()])
text = ch[6:] + ' ' + text
with open(path,'a',encoding = 'utf-8') as fp:
fp.writelines(text + '\n')
def main():
# 建立執行緒
print('啟動執行緒.....')
thread_hi = threading.thread(target=labelfileorg)
thread_hello = threading.thread(target=labelfileorg,args=('hello',1))
# 啟動執行緒
thread_hi.start()
thread_hello.start()
print('main thread has ended!')
if __name__ == '__main__':
t1 = time.time()
main()
print(time.time() - t1)
python中最常見的非同步程式設計操作,是用asyncio模組。詳細使用介紹見python 非同步程式設計入門
使用方法
# encoding = utf-8
import asyncio
async def count():
print("one")
await asyncio.sleep(1)
print("two")
async def main():
await asyncio.gather(count(), count(), count())
asyncio.run(main())
C 非同步程式設計與多執行緒程式設計
c 5.0推出了非同步程式設計,通過關鍵字async 和 await及返回型別為task 無返回值的非同步方法 和task 返回值為t的非同步方法 可以將方法封裝為非同步方法。呼叫非同步方法時,遇到await關鍵字程式會立即返回到呼叫者,直到await後的方法執行完成。包括兩種非同步方式 i o繫結...
C 併發程式設計 非同步程式設計與多執行緒
併發 同時做多件事情 多執行緒 併發的一種形式,它採用多個執行緒來執行程式。並行處理 把正在執行的大量的任務分割成小塊,分配給多個同時執行的執行緒。並行處理是多執行緒的一種,而多執行緒是併發的一種。非同步程式設計 併發的一種形式,它採用 future 模式或 callback 機制,以避免產生不必要...
多執行緒與非同步
基於任務的非同步程式設計模型 tap 提供了非同步 的抽象化。你只需像往常一樣將 編寫為一連串語句即可。就如每條語句在下一句開始之前完成一樣,你可以流暢地閱讀 編譯器將執行許多轉換,因為其中一些語句可能會開始執行並返回表示正在進行的工作的 task。這就是此語法的目標 支援讀起來像一連串語句的 但會...