《云计算全栈》-多线程编程:forking基础应用、扫描存活主机、利用fork创建TCP服务器、创建多线程时间戳服务器

本文详细介绍了使用Python进行多线程编程的四个案例,包括基于forking的基础应用,扫描存活主机,利用fork创建TCP服务器以及创建多线程时间戳服务器。通过这些案例,读者可以深入理解Python在多线程和网络编程中的应用。
摘要由CSDN通过智能技术生成
案例1:forking基础应用
案例2:扫描存活主机
案例3:利用fork创建TCP服务器
案例4:扫描存活主机
案例5:创建多线程时间戳服务器

1 案例1:forking基础应用
1.1 问题

编写一个myfork.py脚本,实现以下功能:

在父进程中打印“In parent”然后睡眠10秒
在子进程中编写循环,循环5次,输出当前系统时间,每次循环结束后睡眠1秒
父子进程结束后,分别打印“parent exit”和“child exit”

1.2 方案

子进程运行时是从 pid = os.fork() 下面语句执行,实际上,该语句是两条语句, os.frok() 是创建子进程语句,而 pid = 是赋值语句,所以在创建完子进程后,下一句为运行赋值语句。

进程调用fork函数时,操作系统会新建一个子进程,它本质上与父进程完全相同。操作系统是将当前的进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回。子进程接收返回值为0,此时pid=0,而父进程接收子进程的pid作为返回值。调用fork函数后,两个进程并发执行同一个程序,首先执行的是调用了fork之后的下一行代码。

此时,pid两个值,同时满足判断语句if和else,按照顺序执行如下:

父进程先执行:程序先输出“In parent!”,然后父进程睡眠10s,即进程挂起10s

父进程挂起时,子进程开始执行:循环5次,每循环一次打印当前时间后睡眠1s,5s后结束五次循环,打印“child exit”,此时子进程已经结束

子进程接收后,父进程挂起尚未结束,当父进程睡眠时间结束后,打印“parent exit”,父进程也结束了。
1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:编写脚本

[root@localhost day09]# vim myfork.py
#!/usr/bin/env python3
import os
import time
from datetime import datetime
pid = os.fork()
if pid:
    print("In parent!")
    time.sleep(10)
    print("parent exit")
else:
    for i in range(5):
        print(datetime.now())
        time.sleep(1)
    print("child exit")

步骤二:测试脚本执行

[root@localhost day09]# python3 myfork.py 
In parent!
2018-09-03 10:48:46.552528
2018-09-03 10:48:47.553714
2018-09-03 10:48:48.554800
2018-09-03 10:48:49.555901
2018-09-03 10:48:50.557035
child exit
parent exit

2 案例2:扫描存活主机
2.1 问题

创建forkping.py脚本,实现以下功能:

通过ping测试主机是否可达
如果ping不通,不管什么原因都认为主机不可用
通过fork方式实现并发扫描

2.2 方案

定义函数ping(),该函数可实现允许ping通任何主机功能:

1.引用subprocess模块执行shell命令ping所有主机,将执行结果返回给rc变量,此时,如果ping不通返回结果为1,如果能ping通返回结果为0

2.如果rc变量值不为0,表示ping不通,输出down

3.否则,表示可以ping通,输出up

利用列表推导式生成整个网段的IP地址列表[172.40.58.1,172.40.58.2…]

循环遍历整个网段列表,每循环出一个ip,os.fork()生成1个子进程和1个父进程,

此时,如果pid返回值为0,子进程以ip作为实际参数调用ping函数,调用后一定要exit(),确保子进程ping完一个地址后结束,不要再循环生成父子进程。

subprocess.call(
        'ping -c2 %s &> /dev/null' % host,
        shell=True
    )

注意:shell命令ping所有主机时,ping发送一个ICMP请求&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值