欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Lua之協(xié)同程序(coroutine)-創(chuàng)新互聯(lián)

什么是協(xié)同(coroutine)?

Lua 協(xié)同程序(coroutine)與線程比較類似:擁有獨(dú)立的堆棧,獨(dú)立的局部變量,獨(dú)立的指令指針,同時(shí)又與其它協(xié)同程序共享全局變量和其它大部分東西。

創(chuàng)新互聯(lián)成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),成都響應(yīng)式網(wǎng)站建設(shè)公司,網(wǎng)頁(yè)設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:18982081108

協(xié)同是非常強(qiáng)大的功能,但是用起來也很復(fù)雜。

線程和協(xié)同程序區(qū)別

線程與協(xié)同程序的主要區(qū)別在于,一個(gè)具有多個(gè)線程的程序可以同時(shí)運(yùn)行幾個(gè)線程,而協(xié)同程序卻需要彼此協(xié)作的運(yùn)行。

在任一指定時(shí)刻只有一個(gè)協(xié)同程序在運(yùn)行,并且這個(gè)正在運(yùn)行的協(xié)同程序只有在明確的被要求掛起的時(shí)候才會(huì)被掛起。

協(xié)同程序有點(diǎn)類似同步的多線程,在等待同一個(gè)線程鎖的幾個(gè)線程有點(diǎn)類似協(xié)同。

基本語(yǔ)法

方法描述
coroutine.create()創(chuàng)建coroutine,返回coroutine, 參數(shù)是一個(gè)函數(shù),當(dāng)和resume配合使用的時(shí)候就喚醒函數(shù)調(diào)用
coroutine.resume()重啟coroutine,和create配合使用
coroutine.yield()掛起coroutine,將coroutine設(shè)置為掛起狀態(tài),這個(gè)和resume配合使用能有很多有用的效果
coroutine.status()查看coroutine的狀態(tài)
注:coroutine的狀態(tài)有三種:dead,suspend,running,具體什么時(shí)候有這樣的狀態(tài)請(qǐng)參考下面的程序
coroutine.wrap()創(chuàng)建coroutine,返回一個(gè)函數(shù),一旦你調(diào)用這個(gè)函數(shù),就進(jìn)入coroutine,和create功能重復(fù)
coroutine.running()返回正在跑的coroutine,一個(gè)coroutine就是一個(gè)線程,當(dāng)使用running的時(shí)候,就是返回一個(gè)corouting的線程號(hào)
function foo(a)
	print("foo 函數(shù)輸出 ",a)
	-- 返回2*a的值
	return coroutine.yield(2 * a)
end

co = coroutine.create(function (a,b)
--cp-body 1 10
	print("第一次協(xié)同程序執(zhí)行輸出 ", a,b)
	local r = foo(a + 1)

	print("第二次協(xié)同程序輸出 ",r)
--a,b的值為第一次調(diào)用協(xié)同程序時(shí)傳入
	local r,s = coroutine.yield(a+b, a - b)

	print("第三次協(xié)同程序輸出 ",r,s)
	--b的值為第二次調(diào)用協(xié)同程序時(shí)傳入
	return b,"結(jié)束協(xié)同程序"
end)

print("---------------分割線---------------");
print("main", coroutine.resume(co,1,10))  --true 4
print("協(xié)同程序的狀態(tài): ",coroutine.status(co))


print("---------------分割線---------------");
print("main", coroutine.resume(co,"r"))  --true 4
print("協(xié)同程序的狀態(tài): ",coroutine.status(co))

print("---------------分割線---------------");
print("main", coroutine.resume(co,"x","y"))  --true 4
print("協(xié)同程序的狀態(tài): ",coroutine.status(co))

print("---------------分割線---------------");
print("main", coroutine.resume(co,"x","y"))  --true 4
print("協(xié)同程序的狀態(tài): ",coroutine.status(co))

print("---------------分割線---------------");

Lua之協(xié)同程序(coroutine)

以上實(shí)例接下如下:

  • 調(diào)用resume,將協(xié)同程序喚醒,resume操作成功返回true,否則返回false;

  • 協(xié)同程序運(yùn)行;

  • 運(yùn)行到y(tǒng)ield語(yǔ)句;

  • yield掛起協(xié)同程序,第一次resume返回;(注意:此處yield返回,參數(shù)是resume的參數(shù))

  • 第二次resume,再次喚醒協(xié)同程序;(注意:此處resume的參數(shù)中,除了第一個(gè)參數(shù),剩下的參數(shù)將作為yield的參數(shù))

  • yield返回;

  • 協(xié)同程序繼續(xù)運(yùn)行;

  • 如果使用的協(xié)同程序繼續(xù)運(yùn)行完成后繼續(xù)調(diào)用 resume方法則輸出:cannot resume dead coroutine

resume和yield的配合強(qiáng)大之處在于,resume處于主程中,它將外部狀態(tài)(數(shù)據(jù))傳入到協(xié)同程序內(nèi)部;而yield則將內(nèi)部的狀態(tài)(數(shù)據(jù))返回到主程中。

=============================================================================

生產(chǎn)者-消費(fèi)者問題

現(xiàn)在我就使用Lua的協(xié)同程序來完成生產(chǎn)者-消費(fèi)者這一經(jīng)典問題。

local newProductor

function productor()
	local i= 0;
	while true do
		i = i + 1;
		send(i) -- 將生產(chǎn)的物品發(fā)給消費(fèi)者
	end
end

function consume()
	i = 0
	while (i < 10) -- 控制大小
	do
		i = i + 1
		local i = receive() --從生產(chǎn)者那里得到物品
		print(i)
	end
end

function receive()
	local status , value = coroutine.resume(newProductor)
	return value
end

function send(x)
--x表示需要發(fā)生的值,值返回以后,就掛起該協(xié)同程序
	coroutine.yield(x)
end

-- 啟動(dòng)程序
newProductor = coroutine.create(productor)
consume()

Lua之協(xié)同程序(coroutine)

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站名稱:Lua之協(xié)同程序(coroutine)-創(chuàng)新互聯(lián)
文章起源:http://chinadenli.net/article40/djooeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)靜態(tài)網(wǎng)站網(wǎng)站維護(hù)外貿(mào)網(wǎng)站建設(shè)ChatGPT面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)