[新手求救] python socket問題

18 回覆
0 Like 0 Dislike
2017-05-26 22:36:50
最近學緊python
但係好快就碰壁
所以想問問點解決
希望大家可以幫幫手

Server:
用threading等client可以同時入嚟
等client連入嚟
之後再揀client同佢溝通

Client:
連入server後等server出聲先再覆佢

問題係唔識點樣揀client溝通

google睇過話要整個list 去儲存啲connection
但都唔係好明

可能只係一個好垃圾嘅問題
但係都希望大家可以解答我
2017-05-26 23:19:25
求救
2017-05-27 01:09:37
2017-05-27 01:58:44
2017-05-27 02:01:32
python
2017-05-27 02:50:57
真心求救
2017-05-27 13:34:15
2017-05-27 16:33:42
python我唔熟
不過正常socket listen時如果有incoming connection應該會return一個client object
server要做既就係搵一條thread不斷listen+push client入條list
之後你想一個client一個thread或者第二條thread loop client list都得
2017-05-27 16:37:05
自己搵python library reference 18.1睇下啦
2017-05-27 19:05:17
啱啱寫完一個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
2017-05-27 19:07:15
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
2017-05-27 19:59:17
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唔敢講
2017-05-27 20:00:18
啱啱寫完一個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

高質
2017-05-27 20:33:27
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下。
2017-05-27 21:03:13
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問題 新手唔易搞
2017-05-27 21:31:50
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問題 新手唔易搞

其實之前(5-6都幾年前)未學到咁深嘅時候已經聽過好多apache問題,所以當時已經轉nginx,到依家都唔再用apache
去到依家係大學讀到OS先明究竟係咩一回事,點解Apache慢
2017-05-28 20:31:10
多謝大家解答
問題已經解決咗
連登有愛

btw之後你哋講個啲野真係唔係好明
2017-05-29 08:32:14
多謝大家解答
問題已經解決咗
連登有愛

btw之後你哋講個啲野真係唔係好明

其實用python寫隨時要用subprocess,先可以真正做到multi process,用嘅memory仲多過開thread,你最好點寫?
吹水台自選台熱 門最 新手機台時事台政事台World體育台娛樂台動漫台Apps台遊戲台影視台講故台健康台感情台家庭台潮流台美容台上班台財經台房屋台飲食台旅遊台學術台校園台汽車台音樂台創意台硬件台電器台攝影台玩具台寵物台軟件台活動台電訊台直播台站務台黑 洞