python的多執行緒與非同步程式設計

2021-10-03 23:13:37 字數 3252 閱讀 4468

作業系統中,程序是資源分配的基本單位,執行緒是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。這就是此語法的目標 支援讀起來像一連串語句的 但會...