http.server做的httpserver 在主行程中運行正常,放到multiprocessing的子行程中就不能正常運行。查看日志發現卡在self.send_response(200) 這一句。放到子行程中運行是為了方便結束這個行程。以下是代碼
#!/usr/bin/env python
#--coding:utf-8--
from multiprocessing import Process
from http.server import BaseHTTPRequestHandler, HTTPServer
import os
from os import path
from urllib.parse import urlparse
import asyncio
import websockets
import logging
import logging.handlers
import datetime
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
rf_handler = logging.handlers.TimedRotatingFileHandler('all.log', when='midnight', interval=1, backupCount=7, atTime=datetime.time(0, 0, 0, 0))
rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(message)s"))
f_handler = logging.FileHandler('error.log')
f_handler.setLevel(logging.ERROR)
f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))
logger.addHandler(rf_handler)
logger.addHandler(f_handler)
os.environ['path']=os.environ['path']+';'+os.path.abspath('')
def websocketservice():
# 接收客戶端訊息并處理,這里只是簡單把客戶端發來的回傳回去
async def recv_msg(websocket):
while True:
recv_text = await websocket.recv()
response_text = f"your submit context: {recv_text}"
await websocket.send(response_text)
# 服務器端主邏輯
# websocket和path是該函式被回呼時自動傳過來的,不需要自己傳
async def main_logic(websocket, path):
await recv_msg(websocket)
# 把ip換成自己本地的ip
start_server = websockets.serve(main_logic, '127.0.0.1', 999)
# 如果要給被回呼的main_logic傳遞自定義引數,可使用以下形式
# 一、修改回呼形式
# import functools
# start_server = websockets.serve(functools.partial(main_logic, other_param="test_value"), '10.10.6.91', 5678)
# 修改被回呼函式定義,增加相應引數
# async def main_logic(websocket, path, other_param)
print("webserver started")
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
def httpservice():
curdir = path.dirname(path.realpath(__file__))
sep = '/'
# MIME-TYPE
mimedic = [
('.html', 'text/html'),
('.htm', 'text/html'),
('.js', 'application/javascript'),
('.css', 'text/css'),
('.json', 'application/json'),
('.png', 'image/png'),
('.jpg', 'image/jpeg'),
('.gif', 'image/gif'),
('.txt', 'text/plain'),
('.avi', 'video/x-msvideo'),
]
class myHTTPServer_RequestHandler(BaseHTTPRequestHandler):
# GET
def do_GET(self):
sendReply = False
querypath = urlparse(self.path)
filepath, query = querypath.path, querypath.query
if filepath.endswith('/'):
filepath += 'index.html'
filename, fileext = path.splitext(filepath)
for e in mimedic:
if e[0] == fileext:
mimetype = e[1]
sendReply = True
if sendReply == True:
try:
logger.debug(sendReply)
with open(path.realpath(curdir + sep + filepath),'rb') as f:
content = f.read()
logger.debug('0')
self.send_response(200) #這一句過不了,日志只能列印到0,1不能列印出來
logger.debug('1')
self.send_header('Content-type',mimetype)
logger.debug('2')
self.end_headers()
logger.debug('3')
self.wfile.write(content)
logger.debug("4")
except IOError:
self.send_error(404,'File Not Found: %s' % self.path)
logger.debug("失敗")
port = 8080
print('starting server, port', port)
# Server settings
server_address = ('',port)
httpd = HTTPServer(server_address, myHTTPServer_RequestHandler)
logger.debug('running server...')
httpd.serve_forever()
if __name__ == '__main__':
p1=Process(target=httpservice)
p1.daemon=True
p1.start()
print("行程1")
p2=Process(target=websocketservice)
p2.daemon=True
p2.start()
print("行程2")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236761.html
