Python3使用多进程和多线程的方式检查网络状态
2018-02-05 00:00
591 查看
需求设定:
家里的宽带最近非常不稳定,师傅上门后,总感觉还是有问题。写了个脚本,每隔N秒连一下网,看看有没有掉网。
实现方案:
python3,联网使用requests库,
使用自带的logging模块,发现连接不上,写入到logging.log文件中
为了实验多进程,特意将联网专门启动了一个子进程:
父进程:启动子进程,子进程中获得消息,因为从子进程中获取消息的方法是阻塞的,得单独启动一个线程,对收到的信息进行loging
子进程:每隔N秒联网,发现连接不上,就向主进程发送消息。同时启动一个线程来接收主进程相关的消息
进程中通信,使用pipe的方式,pipe()返回一对连接对象,代表了pipe的两端。每个对象都有send()和recv()方法。
代码如下:
家里的宽带最近非常不稳定,师傅上门后,总感觉还是有问题。写了个脚本,每隔N秒连一下网,看看有没有掉网。
实现方案:
python3,联网使用requests库,
使用自带的logging模块,发现连接不上,写入到logging.log文件中
为了实验多进程,特意将联网专门启动了一个子进程:
父进程:启动子进程,子进程中获得消息,因为从子进程中获取消息的方法是阻塞的,得单独启动一个线程,对收到的信息进行loging
子进程:每隔N秒联网,发现连接不上,就向主进程发送消息。同时启动一个线程来接收主进程相关的消息
进程中通信,使用pipe的方式,pipe()返回一对连接对象,代表了pipe的两端。每个对象都有send()和recv()方法。
代码如下:
# -*- encoding:utf-8 -*- import requests import multiprocessing import time import threading import logging import os #初始化Log,将Log记录到 def iniLog(): logfile = 'logging.log' log_format = '%(filename)s [%(asctime)s] [%(levelname)s] %(message)s' #todox jeig support utf8 encode handler = logging.FileHandler(logfile, "a",encoding = "UTF-8") formatter = logging.Formatter(log_format) handler.setFormatter(formatter) root_logger = logging.getLogger() root_logger.addHandler(handler) root_logger.setLevel(logging.INFO) #子进程接收消息 def recv_message_child(conn): while True: print('子进程正在等待消息') print('获得消息:'+conn.recv()) #父进程接收消息 def recv_message_parent(conn): while True: print('父进程正在等待消息') print('获得消息:'+conn.recv()) logging.info(conn.recv()) #尝试联网的时间间隔,以秒为单位 TRY_TIME_SPACE_SECCOND = 15 #子进程监测网络,每隔TRY_TIME_SPACE_SECCOND秒来访问下百度 def checkNet_process(conn): #打印进程号 print("当前进程ID:%s,父进程ID:%s" % (os.getpid(),os.getppid())) # 子进程启动线程,来接收父进程发送的消息 t = threading.Thread(target=recv_message_child,args=(conn,)) t.setDaemon(True) t.start() #t.join() headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0', } while True: print('child process is running') try: response = requests.get('http://www.baidu.com',headers=headers) print('返回码:'+str(response.status_code)) print(type(response.status_code)) if response.status_code != 200: #do some task print('+++++++++++++++++++++++++++++++++++++++网络无法访问,状态码:{0}'.format(response.status_code)) conn.send('网络无法访问,状态码:{0}'.format(response.status_code)) else: print('网络正常访问') except Exception as e: print('网络异常报错') conn.send('网络报错:'+str(e)) finally: time.sleep(TRY_TIME_SPACE_SECCOND) if __name__ == '__main__': iniLog() logging.info('net check start!') #开辟两个口,都是能进能出,括号中如果False即单向通信 conn_parent,conn_child=multiprocessing.Pipe() p=multiprocessing.Process(target=checkNet_process,args=(conn_child,)) #子进程使用sock口,调用checkNet_process函数 p.start() #父进程启动线程,来接收子进程发送的消息 t = threading.Thread(target=recv_message_parent, args=(conn_parent,)) t.setDaemon(True) t.start() t.join()
相关文章推荐
- 网络编程中设计并发服务器,使用多进程与多线程有什么区别?
- 使用Python SocketServer快速实现多线程网络服务器
- 为什么在Python里推荐使用多进程而不是多线程?
- 转载:浅析Python中的多进程与多线程的使用
- Python获取CPU使用率、内存使用率、网络使用状态
- 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
- 使用ping命令检查网络状态
- 为什么在Python里推荐使用多进程而不是多线程?
- 用delphi检查网络连接状态3种方式
- python使用多进程或者多线程
- 为什么在python里推荐使用多进程而不是多线程
- 网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?
- 为什么在Python里推荐使用多进程而不是多线程?
- 为什么在Python里推荐使用多进程而不是多线程?
- Python获取CPU使用率、内存使用率、网络使用状态
- 为什么在Python里推荐使用多进程而不是多线程?
- Python获取CPU使用率、内存使用率、网络使用状态
- python(34):为什么在Python里推荐使用多进程而不是多线程?
- Python获取CPU使用率、内存使用率、网络使用状态
- python多线程与多进程 超简单使用