首先,設(shè)計一個一個線程寫一個線程讀的隊列,該隊列有兩個指針讀寫。閱讀線程:1。首先判斷讀寫指針。如果讀取指針==寫入指針,則不返回數(shù)據(jù),否則讀取數(shù)據(jù),然后讀取指針1。寫入線程:1。(如果使用循環(huán)隊列)在寫入線程進入后檢查讀寫指針。如果讀指針=寫指針1,那么寫線程進入線程開關(guān)并繼續(xù)寫,直到讀指針移動。(如果數(shù)據(jù)是可以丟棄的實時數(shù)據(jù),則不能進行判斷)//為了對數(shù)據(jù)進行原子化操作,最好將指針保存在循環(huán)隊列中。2寫指針來寫數(shù)據(jù),1。接下來,考慮當多個線程同時寫入時如何實現(xiàn)。首先,申請TLS值(建議使用運行時,而不是API,因為API進程最多只能申請255,這樣很容易用完)。然后,每個線程保存上面實現(xiàn)的讀寫隊列,并將隊列地址放入一個結(jié)構(gòu)中。每個寫線程將數(shù)據(jù)寫入自己線程所擁有的隊列,每個寫線程將數(shù)據(jù)寫入需要保存的時間計數(shù)(getsystemtimeasfiletime)以判斷每個隊列中節(jié)點的順序。讀取線程依次遍歷所有隊列,取出隊列中的值,并按時間計數(shù)的順序進行處理。
成都創(chuàng)新互聯(lián)專注于綏棱企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),商城網(wǎng)站制作。綏棱網(wǎng)站建設(shè)公司,為綏棱等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)如何實現(xiàn)多個線程寫,一個線程讀的隊列,并且所有線程?有很多方法可以使用它。
如果通話頻率不高,我會做定量分析程序。通常,我使用C來啟用python進程。pypy的速度更快。Pypy將結(jié)果生成到redis或mysql的內(nèi)存表中。調(diào)用后,C轉(zhuǎn)到redis或mysql的內(nèi)存表,也可以用文件寫入來完成,但文件寫入很容易出現(xiàn)不同步,不想用網(wǎng)絡(luò)版,可以用SQLite來寫結(jié)果,然后用SQLite在另一個程序中讀取。如果它類似于Internet服務(wù),則可以使用消息隊列和消息服務(wù)器進行通信。如果您的程序需要線程安全和關(guān)鍵區(qū)域保護,最好使用消息隊列來支持多線程和多進程同時訪問。消息隊列比數(shù)據(jù)庫存儲速度快,但不便于數(shù)據(jù)庫存儲。
vedis的原生版本有C版本,高仿redis的嵌入式版本。您可以使用這個初始開發(fā)。如果您需要切換到redis,您可以輕松地將vedis修改為redis。SSDB可以在地面存儲redis。SSDB是高仿redis的存儲版本。
如果沒有數(shù)據(jù)存儲,可以使用套接字通信或多進程通信。例如,chrome是多進程的,命名管道用于通信。理論上,這可以用于多語言之間的調(diào)用。命名管道比消息隊列快,但需要自定義。調(diào)用方法的協(xié)議可以用JSON來完成,因此一般可以使用n種多語言。如果我們追求性能,我們可以使用二進制通信協(xié)議。
Python調(diào)用C語言的方法也很成熟,但需要編寫一些代碼打包,需要防止內(nèi)存泄漏、多線程同步、阻塞、異常等問題。