用python的multiprocessing模塊把服務(wù)改成多進(jìn)程后, 遇到幾個(gè)問(wèn)題:
數(shù)據(jù)庫(kù)連接失敗, 總是在服務(wù)運(yùn)行幾十秒后, 卡主, 然后報(bào)錯(cuò)數(shù)據(jù)庫(kù)連接失敗
InterfaceError: (0, '')
檢查后發(fā)現(xiàn), 是把數(shù)據(jù)庫(kù)連接的操作放到while循環(huán)中了, 創(chuàng)建了大量的連接導(dǎo)致的服務(wù)是用supervisor工具來(lái)啟動(dòng)的, 當(dāng)用stop停掉這個(gè)含子進(jìn)程的 服務(wù)時(shí), 用ps查看, 發(fā)現(xiàn)只kill掉了父進(jìn)程, 但是子進(jìn)程仍然在后臺(tái)跑著
首先,懷疑是不是守護(hù)進(jìn)程的問(wèn)題, 查看multiprocessing模塊,
p.daemon
默認(rèn)是False, 也就表示, 默認(rèn)不是守護(hù)進(jìn)程這里解釋一下守護(hù)進(jìn)程, 如果一個(gè)子進(jìn)程設(shè)置為守護(hù)進(jìn)程, 那么當(dāng)父進(jìn)程結(jié)束時(shí), 子進(jìn)程不會(huì)隨父進(jìn)程退出, 守護(hù)進(jìn)程也被稱(chēng)為精靈進(jìn)程
回到問(wèn)題, 這里默認(rèn)就設(shè)置了
daemon=False
, 所以也不是這個(gè)問(wèn)題導(dǎo)致然后又發(fā)現(xiàn), 用ctrl+C 結(jié)束進(jìn)程, 就不會(huì)出現(xiàn)這種情況, 所以, 問(wèn)題就指向了supervisor
解決方法:
- 在supervisor的配置中(是指當(dāng)前服務(wù)的配置), 添加兩條
killasgroup=true
stopasgroup=true
然后別忘了在supervisorctl的控制臺(tái)中,update
一下