python異步多線程,PHP多線程pthreads踩坑記

 2023-10-25 阅读 32 评论 0

摘要:最近由于項目需求,對配資訂單需要間隔自動掃描(例如5s或者10s的時間間隔),篩選出未結算的訂單所對應的股票代碼,然后去拉取最新的股票數據,然后再綜合各項約束篩選出要結算的訂單,然后暫時設定這些訂單為結算中狀態(

最近由于項目需求,對配資訂單需要間隔自動掃描(例如5s或者10s的時間間隔),篩選出未結算的訂單所對應的股票代碼,然后去拉取最新的股票數據,然后再綜合各項約束篩選出要結算的訂單,然后暫時設定這些訂單為結算中狀態(以防后續的結算任務請求和當前的結算任務沖突),然后進行訂單結算,然后再釋放訂單的結算狀態。

方案是這么設想的,但問題是如果有很多不同的股票代碼需要同時拉取最新數據,又要同時保持5s的刷新頻率,如果僅僅用單線程,很可能第一個結算任務過了5s甚至10s都還沒有完成,但第二甚至第三個任務又啟動起來了,這一方面有可能造成數據沖突,另一方面就是結算速度太慢了不僅影響體驗而且可能造成進程數越來越多服務器到最后卡死。如果同時一次性將各個不同的股票代碼組合起來,統一一次性去拉取最新的股票數據也是可行的一個方式,但如果股票代碼多,對應的需要結算的訂單多還是會出現服務器卡死的情況。

所以,我們自然會考慮多線程或者多進程,但多進程占用資源比較多,如果進程數比較多的話同樣容易使機器變得卡死,多線程理論上也會有這樣的問題,但是畢竟比進程輕量許多,所以,就想到使用多線程來做訂單的并行結算可能比較合適。

python異步多線程?但php本身是不支持多線程的,需要安裝擴展,而安裝pthreads擴展需要zts版本的php,在linux系統里需要自己重新編譯php源代碼并帶上 –enable-maintainer-zts選項。

然而環境搭好以后你以為就可以輕松地進行php多線程變成了嗎?too young. 有些系統的函數在zts版本的php下可能會執行不成功,而且沒有任何報錯,會被直接忽略,所以你也不好調試;而多線程的代碼調試起來難度本身又更大。所以造成了用pthreads擴展來進行多線程編程其實體驗是很差的,而且案例少,資料少,而且pthreads的源碼已經有3年左右沒有更新過了,所以使用pthreads進行php的多線程編程其實并不是一個明智之舉,pthreads并不是php的一個多線程的成熟解決方案,只不目前而言php沒得選擇,因為原生php是不支持多線程的,所以說這也是php的一個比較大的弱點,畢竟現代的網絡應用,高并發可以說是非常常見的典型場景了。

在使用pthreads進行多線程編程過程中,目前發現了以下幾個坑:
(1)有些系統函數在zts版本中,在多線程的run方法中執行不成功,比如file_put_contents(),可能需要的配置環境不一樣,就像第二點一樣。
(2)zts版本的php執行有關時間的php腳本會要求設置default_time_zone,可以動態設置,也可以在php.ini里設置date.time_zone=PRC(推薦),因為php.ini里設置了,那么run方法里面有涉及到時間的代碼才不會出錯,動態設置的在這種情況就會出錯。
(3)多線程代碼不好調試,而且如前述,有些代碼在普通版本的php里執行是沒有問題的,但在zts版本里執行就是執行不成功甚至沒有任何錯誤提示。針對這種情況,目前想到的就是先把線程的run方法當作普通方法來調用,先測試一下。對于沒有任何錯誤提示的情況可以考慮xdebug,另外我用try catch也捕獲過異常,從而獲得了一些錯誤提示信息。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/165927.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息