最近學緊python
但係好快就碰壁
所以想問問點解決
希望大家可以幫幫手
Server:
用threading等client可以同時入嚟
等client連入嚟
之後再揀client同佢溝通
Client:
連入server後等server出聲先再覆佢
問題係唔識點樣揀client溝通
google睇過話要整個list 去儲存啲connection
但都唔係好明
可能只係一個好垃圾嘅問題
但係都希望大家可以解答我
python我唔熟
不過正常socket listen時如果有incoming connection應該會return一個client object
server要做既就係搵一條thread不斷listen+push client入條list
之後你想一個client一個thread或者第二條thread loop client list都得
python我唔熟
不過正常socket listen時如果有incoming connection應該會return一個client object
server要做既就係搵一條thread不斷listen+push client入條list
之後你想一個client一個thread或者第二條thread loop client list都得
我最近寫C係用main thread不斷listen,但係有connection就直接spawn child thread,無push入queue,到client disconnect,條thread個function就會自己end。唔知咁做啱唔啱,但係work
啱啱寫完一個multi-thread C tcp socket program,唔知點用python寫。pure python應該寫唔到真multithread program,因為GIL(Global Interpreter Lock)係會lock到python bytecode唔可以同時行,只會係咁switch thread行,成件事有啲on9,基本上要python做到真multi-thread只可以用C extensions。
python官方wiki有講
https://wiki.python.org/moin/GlobalInterpreterLock
另外依到有另一個解釋
https://stackoverflow.com/questions/20939299/does-python-support-multithreading-can-it-speed-up-execution-time
python我唔熟
不過正常socket listen時如果有incoming connection應該會return一個client object
server要做既就係搵一條thread不斷listen+push client入條list
之後你想一個client一個thread或者第二條thread loop client list都得
我最近寫C係用main thread不斷listen,但係有connection就直接spawn child thread,無push入queue,到client disconnect,條thread個function就會自己end。唔知咁做啱唔啱,但係work
我印象中Apache係咁嘅做法
有幾條thread係咁loop client係Nginx做法
邊個好d唔敢講
python我唔熟
不過正常socket listen時如果有incoming connection應該會return一個client object
server要做既就係搵一條thread不斷listen+push client入條list
之後你想一個client一個thread或者第二條thread loop client list都得
我最近寫C係用main thread不斷listen,但係有connection就直接spawn child thread,無push入queue,到client disconnect,條thread個function就會自己end。唔知咁做啱唔啱,但係work
我印象中Apache係咁嘅做法
有幾條thread係咁loop client係Nginx做法
邊個好d唔敢講
啱啱睇咗nginx個documentation,真係用一個module去mon一堆file descriptor,然後一個當有file descriptor有new data嘅時候,loop不斷派job比thread。
nginx用咗好多唔同syscall去做mon file descriptor嘅module,基本上有啲os specific嘅syscall會快啲嘅話,就會用嗰啲,例如linux用epoll,bsd用kqueue。
啱啱睇咗一輪,好似一般嚟講用nginx嘅implementation會scalable啲,雖然mon一堆file descriptor係有啲晒時間,但係apache(我用個方法)係好多connection嘅情況,會有好大memory pressure,而且唔夠thread嘅話會好多context switch,最後得不償失。基本上係要好多thread+memory嘅server,apache先可能有優勢(唔肯定,無testing support),或者其實apache無咩優勢,因為就算有100條logical threads(而且好多server都無咁多threads),要每條handle 100個request都好多context switch下。
python我唔熟
不過正常socket listen時如果有incoming connection應該會return一個client object
server要做既就係搵一條thread不斷listen+push client入條list
之後你想一個client一個thread或者第二條thread loop client list都得
我最近寫C係用main thread不斷listen,但係有connection就直接spawn child thread,無push入queue,到client disconnect,條thread個function就會自己end。唔知咁做啱唔啱,但係work
我印象中Apache係咁嘅做法
有幾條thread係咁loop client係Nginx做法
邊個好d唔敢講
啱啱睇咗nginx個documentation,真係用一個module去mon一堆file descriptor,然後一個當有file descriptor有new data嘅時候,loop不斷派job比thread。
nginx用咗好多唔同syscall去做mon file descriptor嘅module,基本上有啲os specific嘅syscall會快啲嘅話,就會用嗰啲,例如linux用epoll,bsd用kqueue。
啱啱睇咗一輪,好似一般嚟講用nginx嘅implementation會scalable啲,雖然mon一堆file descriptor係有啲晒時間,但係apache(我用個方法)係好多connection嘅情況,會有好大memory pressure,而且唔夠thread嘅話會好多context switch,最後得不償失。基本上係要好多thread+memory嘅server,apache先可能有優勢(唔肯定,無testing support),或者其實apache無咩優勢,因為就算有100條logical threads(而且好多server都無咁多threads),要每條handle 100個request都好多context switch下。
新web server嘅出現好大原因係因為C10M problem(10 million concurrent connection)(其實已經唔算新)
Apache咁樣開thread法 好難應付到大量request
不過入門學client-server programming嚟講
一個client開一條新thread比較易
用Nginx做法好多synchronization問題 新手唔易搞
多謝大家解答
問題已經解決咗
連登有愛
btw之後你哋講個啲野真係唔係好明