筆者是一個python初學者,因為Windows有圖形化界面寫代碼方便,基本代碼都是在Windows下寫的,這就導致了出現很多問題,比如使用創建多進程來實現服務器並發會出現一些很難想象到的錯誤,如:
OSError: [WinError 10048] 通常每個套接字地址(協議/網絡地址/端口)只允許使用一次。
錯誤代碼如下:
import socket import multiprocessing def send(new): data = new.recv(1024) print(data.decode("gbk")) def main(): tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) tcp.bind(("", 7890)) tcp.listen(128) print("- - - -- - ") while True: new, address = tcp.accept() print("連接成功") p = multiprocessing.Process(target=send, args=(new, )) p.start() new.close() tcp.close() main()
原因, 在Windows中因為子進程會復制主進程中所有代碼導致相同的端口在子進程中同樣被綁定,解決辦法是程序最后做一個判斷
if __name__ == '__main__': main()
問題就解決了,還有在使用進程池的時候切記一定要加這一句否則子進程會遞歸的添加進程到進程池形成死循環.