第10章 网络程序设计
10.1 简单解释TCP和UDP协议的区别。 答:
TCP协议是面向连接的、具有质量保证的可靠传输协议,但开销较大;UDP协议是尽最大能力传输的无连接协议,开销小,常用于视频在线点播(Video On Demand, VOD)之类的应用。TCP协议和UDP协议并没有优劣之分,仅仅是适用场合有所不同。
10.2 同学之间合作编写UDP通信程序,分别编写发送端和接收端代码,发送端发送一个字符串“Hello world!”。假设接收端在计算机的5000端口进行接收,并显示接收内容。
答:首先使用ipconfig/all命令查看本机IP地址,然后分别编写下面的代码,并将其中的IP地址替换为相应的IP地址。
接收端代码:
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind((\ #空字符串表示本机任何可用IP地址 data, addr=s.recvfrom(1024) # 缓冲区大小为1024字节 print ' received message:%s' % data #显示接收到的内容 s.close( )
发送端代码:
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(\假设10.20.52.248是接收端主机的IP地址 s.close( )
10.3 简单介绍socket模块中用于TCP编程的常用方法。
TCP一般用于要求可靠数据传输的场合。编写TCP程序时经常需要用到的socket模块方法主要有:
? ? ? ? ? ?
connect(address):连接远程计算机 send(bytes[,flags]):发送数据 recv(bufsize[,flags]):接收数据 bind(address):绑定地址
listen(backlog):开始监听,等待客户端连接 accept():响应客户端的请求
10.4 编写代码读取搜狐网页首页内容。
答:
>>> import urllib.request >>> dir(urllib.request)
>>> fp = urllib.request.urlopen('http://www.sohu.com.cn') >>> dir(fp)
>>> print(fp.read(100)) >>> fp.close()
10.5 在自己的机器上配置IIS以支持Python脚本的运行,然后使用Python编写脚本,运行后在网页上显示“Hello world!”。
答:核心代码为
print 'Status: 200 OK'
print 'Content-type: text/html' print
print '
print '
This is a header
' print 'Hello world!' print '
'
print ''
第11章 大数据处理
11.1 简单介绍常见的大数据处理框架。 答:主要有三种,
? MapReduce:分布式计算框架,可以将单个大型计算作业分配给多台计算机执行,可以在短时间内完成大量工作,尤其适合数值型和标称型数据,但需要对行业领域具有一定理解后重写算法来完成特定的业务处理要求。MapReduce的名字由函数式编程中常用的map和reduce两个单词组成。MapReduce在大量节点组成的集群上运行,工作流程是:单个作业被分成很多小份,输入数据也被切片并分发到每个节点,每个节点只在本地数据上做运算,对应的运算代码称为mapper,这个过程即map阶段;每个mapper的输出通过某种方式组合,根据需要可能再进行重新排序,排序后的结果再被切分成小份并分发到各个节点进行下一步处理,这个过程被称为reduce阶段,对应的代码称为reducer。不同类型的作业可能需要不同数量的reducer,并且,在任何时候,每个mapper或reducer之间都不进行通信,每个节点只负责处理自己的事务,并且只在分配到本地的数据集上进行运算。
? Hadoop:Hadoop是MapReduce框架的一个免费开源实现,采用Java语言编写,支持在大量机器上分布式处理数据。除了分布式计算之外,Hadoop还自带分布式文件系统,可以在上面运行多种不同语言编写的分布式程序。Hadoop在可伸缩性、健壮性、计算性能和成本上具有无可替代的优势,事实上已成为当前互联网企业主流的大数据分析平台。
? Spark:Spark是一个针对超大数据集合的低延迟集群分布式计算系统,比MapReduce快40倍左右。Spark是Hadoop的升级版本,兼容Hadoop的API,能够读写Hadoop的HDFS HBASE 顺序文件等,与之不同的是将结果保存在内存中。 Hadoop作为第一代产品使用了HDFS,第二代加入了Cache来保存中间计算结果,第三代则是Spark倡导的流技术Streaming。
11.2 运行本章中代码并理解MapReduce编程思路。 答:略
第12章 Windows系统编程
12.1 查阅相关资料,解释注册表几大根键的用途。 答:略
12.2 选择一个编写好的Python程序,将其转换为exe可执行文件。 答:略,请参考书中相关介绍。
12.3 编写代码,使用至少3中不同的方法启动Windows自带的计算器程序。 答: 第一种方法: >>> import os
>>> os.system('calc.exe')
第二种方法: >>> import os
>>> os.popen('calc.exe')
第三种方法: >>> import os
>>> os.startfile('calc.exe')
第四种方法:
>>> import win32api
>>> win32api.ShellExecute(0, 'open', 'calc.exe', '', '', 1)
第五种方法:
>>> import win32process >>> handle=win32process.CreateProcess(r'c:\\windows\\system32\\calc.exe','', None,None,0, win32process.CREATE_NO_WINDOW, None, None,win32process.STARTUPINFO())
12.4 编写代码,检测您所使用的操作系统版本。 答:略,请参考12.5节。
第13章 多线程编程
13.1 简单叙述创建线程的方法。 答:
Thread类支持使用两种方法来创建线程,一种是为构造函数传递一个可调用对象,另一种是继承Thread类并在派生类中重写__init__()和run()方法。创建了线程对象以后,可以调用其start()方法来启动,该方法自动调用该类对象的run()方法,此时该线程处于alive状态,直至线程的run()方法运行结束。
13.2 简单叙述Thread对象的方法。 答:
(1)join([timeout]:阻塞当前线程,等待被调线程结束或超时后再继续执行当前线程的后续代码,参数timeout用来指定最长等待时间,单位为秒。
(2)isAlive():测试线程是否处于运行状态
(3)start():自动调用run()方法,启动线程,执行线程代码。
(4)run():线程代码,用来实现线程的功能与业务逻辑,可以在子类中重写该方法来自定义线程的行为。
13.3 简单叙述线程对象的daemon属性的作用和影响。 答:
在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程daemon属性值的不同可能会发生下面的两种情况之一:1)当某子线程的daemon属性为False时,主线程结束时会检测该子线程是否结束,如果该子线程尚未完成,则主线程会等待它完成后再退出;2)当某子线程的daemon属性为True时,主线程运行结束时不对该子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。daemon属性的值默认为False,如果需要修改,则必须在调用start()方法启动线程之前进行修改。
13.4 解释至少3种线程同步方法。 答:
(1)使用Condition对象可以在某些事件触发后才处理数据,可以用于不同线程之间的通信或通知,以实现更高级别的同步。Condition对象除了具有acquire()和release()方法之外,