參考:
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比固安網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式固安網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋固安地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
Goroutine并發(fā)調(diào)度模型深度解析手?jǐn)]一個(gè)協(xié)程池
Golang 的 goroutine 是如何實(shí)現(xiàn)的?
Golang - 調(diào)度剖析【第二部分】
OS線程初始棧為2MB。Go語言中,每個(gè)goroutine采用動(dòng)態(tài)擴(kuò)容方式,初始2KB,按需增長,最大1G。此外GC會(huì)收縮??臻g。
BTW,增長擴(kuò)容都是有代價(jià)的,需要copy數(shù)據(jù)到新的stack,所以初始2KB可能有些性能問題。
更多關(guān)于stack的內(nèi)容,可以參見大佬的文章。 聊一聊goroutine stack
用戶線程的調(diào)度以及生命周期管理都是用戶層面,Go語言自己實(shí)現(xiàn)的,不借助OS系統(tǒng)調(diào)用,減少系統(tǒng)資源消耗。
Go語言采用兩級線程模型,即用戶線程與內(nèi)核線程KSE(kernel scheduling entity)是M:N的。最終goroutine還是會(huì)交給OS線程執(zhí)行,但是需要一個(gè)中介,提供上下文。這就是G-M-P模型
Go調(diào)度器有兩個(gè)不同的運(yùn)行隊(duì)列:
go1.10\src\runtime\runtime2.go
Go調(diào)度器根據(jù)事件進(jìn)行上下文切換。
調(diào)度的目的就是防止M堵塞,空閑,系統(tǒng)進(jìn)程切換。
詳見 Golang - 調(diào)度剖析【第二部分】
Linux可以通過epoll實(shí)現(xiàn)網(wǎng)絡(luò)調(diào)用,統(tǒng)稱網(wǎng)絡(luò)輪詢器N(Net Poller)。
文件IO操作
上面都是防止M堵塞,任務(wù)竊取是防止M空閑
每個(gè)M都有一個(gè)特殊的G,g0。用于執(zhí)行調(diào)度,gc,棧管理等任務(wù),所以g0的棧稱為調(diào)度棧。g0的棧不會(huì)自動(dòng)增長,不會(huì)被gc,來自os線程的棧。
go1.10\src\runtime\proc.go
G沒辦法自己運(yùn)行,必須通過M運(yùn)行
M通過通過調(diào)度,執(zhí)行G
從M掛載P的runq中找到G,執(zhí)行G
1、goroutine:在go語言中,每一個(gè)并發(fā)的執(zhí)行單元叫做goroutine,如果一個(gè)程序中包含多個(gè)goroutine,對兩個(gè)函數(shù)的調(diào)用則可能發(fā)生在同一時(shí)刻
2、main goroutine:當(dāng)一個(gè)程序啟動(dòng)時(shí),其主函數(shù)即在一個(gè)單獨(dú)的goroutine中運(yùn)行,我們叫他為main gorountine
3、go goroutine:新的goroutine會(huì)用go語句來創(chuàng)建,go+函數(shù)名,go語句會(huì)使其語句中的函數(shù)在一新創(chuàng)建的goroutine中運(yùn)行,而go語句本身會(huì)迅速地完成
4、goroutine的退出:主函數(shù)返回時(shí),所有的goroutine都會(huì)被直接打斷,程序退出,除了從主函數(shù)退出或者終止程序之外,沒有其他方法能夠讓一個(gè)goroutine來打斷另一個(gè)的執(zhí)行,但是可以通過另一種方式來實(shí)現(xiàn)這個(gè)目的,通過goroutine之間的通信來讓一個(gè)goroutine請求其他的goroutine,并讓請求的goroutine自行結(jié)束執(zhí)行
分類: 電腦/網(wǎng)絡(luò) 程序設(shè)計(jì) 其他編程語言
問題描述:
頁面代碼如下:%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%
!--#include file="Connections/connVoteSystem" --
%
if(Request("voteitem_id") "") then Command1__send_id = Request("voteitem_id")
end if
%
%
Dim RecVote__MMColParam
RecVote__MMColParam = "1"
If (Request.QueryString("voteitem_id") "") Then
RecVote__MMColParam = Request.QueryString("voteitem_id")
End If
%
%
Dim RecVote
Dim RecVote_numRows
Set RecVote = Server.CreateObject("ADODB.Recordset")
RecVote.ActiveConnection = MM_connVoteSystem_STRING
RecVote.Source = "SELECT * FROM voteShow WHERE voteitem_id = " + Replace(RecVote__MMColParam, "'", "''") + ""
RecVote.CursorType = 0
RecVote.CursorLocation = 2
RecVote.LockType = 1
RecVote.Open()
RecVote_numRows = 0
%
%
if Session("voteOK") 1 then
set Command1 = Server.CreateObject("ADODB.Command")
Command1.ActiveConnection = MM_connVoteSystem_STRING
Command1.CommandText = "UPDATE voteItem SET vote_count = vote_count + 1 WHERE voteitem_id = " + Replace(Command1__send_id, "'", "''") + " "
Command1.CommandType = 1
Command1.CommandTimeout = 0
Command1.Prepared = true
Command1.Execute()
Session("voteOK") = 1
end if
%
%
Dim MM_paramName
%
%
' *** Go To Record and Move To Record: create strings for maintaining URL and Form parameters
Dim MM_keepNone
Dim MM_keepURL
Dim MM_keepForm
Dim MM_keepBoth
Dim MM_removeList
Dim MM_item
Dim MM_nextItem
' create the list of parameters which should not be maintained
MM_removeList = "index="
If (MM_paramName "") Then
MM_removeList = MM_removeList "" MM_paramName "="
End If
MM_keepURL=""
MM_keepForm=""
MM_keepBoth=""
MM_keepNone=""
' add the URL parameters to the MM_keepURL string
For Each MM_item In Request.QueryString
MM_nextItem = "" MM_item "="
If (InStr(1,MM_removeList,MM_nextItem,1) = 0) Then
MM_keepURL = MM_keepURL MM_nextItem Server.URLencode(Request.QueryString(MM_item))
End If
Next
' add the Form variables to the MM_keepForm string
For Each MM_item In Request.Form
MM_nextItem = "" MM_item "="
If (InStr(1,MM_removeList,MM_nextItem,1) = 0) Then
MM_keepForm = MM_keepForm MM_nextItem Server.URLencode(Request.Form(MM_item))
End If
Next
' create the Form + URL string and remove the intial '' from each of the strings
MM_keepBoth = MM_keepURL MM_keepForm
If (MM_keepBoth "") Then
MM_keepBoth = Right(MM_keepBoth, Len(MM_keepBoth) - 1)
End If
If (MM_keepURL "") Then
MM_keepURL = Right(MM_keepURL, Len(MM_keepURL) - 1)
End If
If (MM_keepForm "") Then
MM_keepForm = Right(MM_keepForm, Len(MM_keepForm) - 1)
End If
' a utility function used for adding additional parameters to these strings
Function MM_joinChar(firstItem)
If (firstItem "") Then
MM_joinChar = ""
Else
MM_joinChar = ""
End If
End Function
我將頁面上的變成了復(fù)選框,但是出現(xiàn)如下錯(cuò)誤:
查詢語法錯(cuò)誤,voteitem_id=27,26,?
votesystem/votecount/25行
解析:
你對于ASP懂的多嗎?
單選的上傳一條信息到服務(wù)器
復(fù)選是上傳多條。接收數(shù)據(jù)那需要多個(gè)變量來接收
然后上傳到數(shù)據(jù)庫的時(shí)候也要多個(gè)變量
把這個(gè)弄好就行了
網(wǎng)上也有很多好的投票系統(tǒng)的,推薦
chinaz
#include?stdio.h
void?sort(int?a[][2],int?n)?{
int?i,j,k,t;
for(i?=?0;?i??n?-?1;?++i)?{
k?=?i;
for(j?=?i?+?1;?j?n;?++j)?{
if(a[k][1]??a[j][1])
k?=?j;
}
if(k?!=?i)?{
t?=?a[k][0];
a[k][0]?=?a[i][0];
a[i][0]?=?t;
t?=?a[k][1];
a[k][1]?=?a[i][1];
a[i][1]?=?t;
}
}
}
void?show(int?a[][2],?int?n)?{
int?i;
for(i?=?0;?i??n;?++i)
printf("No%02d?%d\n",a[i][0],a[i][1]);
printf("\n");
}
int?main()?{
int?i,candidate,n?=?10,a[10][2];
for(i?=?0;?i??n;?++i)?{
a[i][0]?=?i?+?1;
a[i][1]?=?0;
}
for(i?=?0;?i??20;?++i)?{
printf("第%d/20個(gè)人投票:",i?+?1);
scanf("%d",candidate);
if(candidate?=?1??candidate?=?10)
++a[candidate?-?1][1];
}
sort(a,n);
show(a,n);
return?0;
}
學(xué)完了 net/http 和 fasthttp 兩個(gè)HTTP協(xié)議接口的客戶端實(shí)現(xiàn),接下來就要開始Server的開發(fā),不學(xué)不知道一學(xué)嚇一跳,居然這兩個(gè)庫還支持Server的開發(fā),太方便了。
相比于Java的HTTPServer開發(fā)基本上都是使用Spring或者Springboot框架,總是要配置各種配置類,各種 handle 對象。Golang的Server開發(fā)顯得非常簡單,就是因?yàn)樘貏e簡單,或者說沒有形成特別統(tǒng)一的規(guī)范或者框架,我發(fā)現(xiàn)了很多實(shí)現(xiàn)方式,HTTP協(xié)議基于還是 net/http 和 fasthttp ,但是 handle 語法就多種多樣了。
先復(fù)習(xí)一下: Golang語言HTTP客戶端實(shí)踐 、 Golang fasthttp實(shí)踐 。
在Golang語言方面,實(shí)現(xiàn)某個(gè)功能的庫可能會(huì)比較多,有機(jī)會(huì)還是要多跟同行交流,指不定就發(fā)現(xiàn)了更好用的庫。下面我分享我學(xué)到的六種Server開發(fā)的實(shí)現(xiàn)Demo。
基于 net/http 實(shí)現(xiàn),這是一種比較基礎(chǔ)的,對于接口和 handle 映射關(guān)系處理并不優(yōu)雅,不推薦使用。
第二種也是基于 net/http ,這種編寫語法可以很好地解決第一種的問題,handle和path有了類似配置的語法,可讀性提高了很多。
第三個(gè)基于 net/http 和 github.com/labstack/echo ,后者主要提供了 Echo 對象用來處理各類配置包括接口和handle映射,功能很豐富,可讀性最佳。
第四種依然基于 net/http 實(shí)現(xiàn),引入了 github.com/gin-gonic/gin 的路由,看起來接口和 handle 映射關(guān)系比較明晰了。
第五種基于 fasthttp 開發(fā),使用都是 fasthttp 提供的API,可讀性尚可,handle配置倒是更像Java了。
第六種依然基于 fasthttp ,用到了 github.com/buaazp/fasthttprouter ,有點(diǎn)奇怪兩個(gè)居然不在一個(gè)GitHub倉庫里。使用語法跟第三種方式有點(diǎn)類似,比較有條理,有利于閱讀。