《分布式与并行计算》大作业

一、实验环境

(1)Windows11

(2)Python:python3.7

(3)socket

(4)threading

(5)bs4

(6)tkinter

(5)开发工具:pycharm

二、实验目标

《分布式与并行计算》课程是专业选修课程,该课程目的在于让学生理解分布式与并行计算相关概念、原理,掌握相关编程技术及其应用,培养学生的软件架构思维。

任务一:网络聊天室项目:学生自行查找相关网络资源,并基于socket+多线程编程实现多人网络聊天室功能(可以是命令行界面的,有GUI图形界面的更佳)

任务二:网页爬虫项目:学生自行查找相关网络资源,并基于soup/xpath+requests+线程池技术实现对相关web数据的并发爬取
三、实验原理

Socket:生成套接字,socket是一个中间层工具,它存在于操作系统的内核。电脑上的进程为了真正通过socket来发送/接受数据,socket必须和一个能够进行数据传送的接口连接起来,再通过那个接口送出数据。这个接口就是端口,而这个连接的过程就叫做绑定。应用层就可以和传输层通过套接字接口(API),区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

Bs4:Beautiful Soup 简称 BS4(其中 4 表示版本号)是一个 Python 第三方库,它可以从 HTML 或 XML 文档中快速地提取指定的数据。提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据。

Threading:在 Python 中,实现多线程的模块叫作 threading,是 Python 自带的模块。我们可以使用 Thread 类来创建一个线程,创建时需要指定 target 参数为运行的方法名称,如果被调用的方法需要传入额外的参数,则可以通过 Thread 的 args 参数来指定。

Tkinter:Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以用GUI 实现很多直观的功能,比如想开发一个计算器,如果只是一个程序输入,输出窗口的话,是没用用户体验的,对于稍有GUI编程经验的人来说,Python的Tkinter界面库是非常简单的。python的GUI库非常多,选择Tkinter,一是最为简单,二是自带库,不需下载安装,随时使用,三则是从需求出发,Python作为一种脚本语言,一种胶水语言,一般不会用它来开发复杂的桌面应用,它并不具备这方面的优势,使用Python,可以把它作为一个灵活的工具,而不是作为主要开发语言,那么在工作中,需要制作一个小工具,肯定是需要有界面的,不仅自己用,也能分享别人使用,在这种需求下,Tkinter是足够胜任的!
四、实验实操及截图
网络聊天室项目:
聊天室的设计思想是:在局域网下,利用socket进行连接通信,当服务器端启动的时候,利用Thread线程不停的等待客户端的链接;当有客户端开启连接的时候,服务器端通过IO流反馈“上线用户”信息给客户端,客户端也使用线程不停的接收服务器的信息,从而实现多人在线聊天功能,与此同时,我们还加入了Tkinter组件,来实现带有GUI界面的更佳聊天效果:

本次实验设计的聊天室可供多人同时聊天,接下来我们就使用 Python 来操作 socket ,实现一个聊天室的一些主要功能。首先我们来回想下,一般的聊天室都是怎样的,有多个用户可以同时在线,他们可以实时获取到消息,实时发送消息。

先给大家看看效果:

本次项目主要分成两个:server.py服务端   client.py客户端

1.首先给大家解析一下服务端的代码:

(1)首先导入所需库包:

 (2)声明时间格式,用于后面记录系统时间,以及设置ip地址和端口号:

(3)创建列表,用于后面给每个套接字发送消息:

 (4)聊天记录存储在当前目录下的serverlog.txt文件中:

 (5)读取套接字,设置离开聊天室的系统通告:

 (6)接收Client端的消息并声明格式发送:

 (7)设置不接受新的套接字进来,实现“多人”:

(8)设置用户进入工作室的样式: 

(9)要支持多个用户的信息收发,我们可以开启线程: 

2.接下来是客户端的代码:

(1)首先还是老样子,导入库包:

 (2)基于Tk设置聊天登录窗口,以及设置用户名长度限制,设置编码格式和连接ip:

(3)设置聊天窗口: 

 (4)接收服务器发来的消息并显示到聊天信息窗口上,与此同时监控用户列表更新

(5)要支持多个用户的信息收发,我们可以开启线程: 

(6)聊天输入窗口的设置 

(7)发送按钮的设置以及函数的调用: 

(2)网页爬虫项目:
作为一个程序员,日常生活多多少少会遇到爬虫项目,当然作为一名程序员,要爬的数据的数据量当然是不少的啦,因此在使用 Python 的过程中,我们可能遇到这样一个场景,需要下载某一个网站上的多个资源:

例如:我们想下载豆瓣电影 Top 250 所有的宣传图片:

如果使用常规的方法来进行爬虫,我们进行了测试: 

我们测试得出,下载 250 张电影宣传图片总共需要花费 20 秒钟 的时间。相对而言,这是非常缓慢的。这是因为,每一次下载都必须在上一次下载结束之后才能进行本次下载。这就相当于我们去银行柜台取钱,在一个窗口多个人同时取钱,就只能进行排队,相对而言就会比较慢。因此这就需要引入本次项目的一个重点内容,那就是多线程并行爬虫:

线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。

因为线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程之中拥有独立的内存单元,而多个线程共享内存,从而极大的提升了程序的运行效率。

线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性,多个线程共享一个进程的虚拟空间。线程的共享环境包括进程代码段、进程的共有数据等,利用这些共享的数据,线程之间很容易实现通信。

操作系统在创建进程时,必须为进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发比使用多进程的性能高得要多。

我们可以看到的是在实际运行过程中,使用多线程的方式进行下载图片总共花费了 5 秒中的时间。和之前的普通方式下载相比,快了进 4 倍

下面附上代码截图以及解析:

(1)导入所需库

(2)指定要爬网址,并生成链接 

(3)基于request请求得到网页响应和bs4获取图片的url 

(4)通过设置表头伪装人为浏览: 

(5)下载图片并制定下载路径: 

 (6)设置如果文件夹不存在就创建,如果文件存在就清空,防止报错:

(7)通过切片获取图片的名称:

(8)设置主函数调用函数: 

(9)结果展示:爬到250张图片,只截了部分: 

五、心得体会
本次的大作业到这里就已经接近了尾声,本次的大作业主要由两部分组成,首先是网络聊天室项目:学生自行查找相关网络资源,并基于socket+多线程编程实现多人网络聊天室功能(可以是命令行界面的,有GUI图形界面的更佳),然后就是网页爬虫项目:学生自行查找相关网络资源,并基于soup/xpath+requests+线程池技术实现对相关web数据的并发爬取,两个作业各有千秋,充分的应用了本学期学到的知识,多线程并发,大大节省了任务运行的时长,在这个大数据时代,数据量大杂,多线程的技术,让我们的工作效率可以得到大大的提升。

聊天室项目,在局域网下,利用socket进行连接通信,当服务器端启动的时候,利用Thread线程不停的等待客户端的链接;当有客户端开启连接的时候,服务器端通过IO流反馈“上线用户”信息给客户端,客户端也使用线程不停的接收服务器的信息,从而实现多人在线聊天功能,与此同时,我们还加入了Tkinter组件,来实现带有GUI界面的更佳聊天效果;以及线程池爬虫,线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。因为线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程之中拥有独立的内存单元,而多个线程共享内存,从而极大的提升了程序的运行效率。

通过本次的大作业,学习到了很多新的知识,也巩固了课上的知识,因此本次的作业还是十分的有意义,在将来的工作中也一定会有一定的应用,但是学无止境,所学的知识还远远不够,在这个科技技术日益发展的时代,还得一直保持一个学者的良好心态。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 设计目的、意义(功能描述) 蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。本次大作业主要是对蒙特·卡罗方法进行并行处理,通过OpenMP、MPI、.NET、Java、Win32API等一系列并行技术和并行机制对该算法进行并行处理,从而也进一步熟悉了蒙特·卡罗方法的串行算法和并行算法,实现了用蒙特·卡罗方法计算出半径为1单位的球体的体积,体会到了并行技术在实际生活中的应用。 2. 方案分析(解决方案) 蒙特·卡罗方法(Monte Carlo method)是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。球的体积可以估算为:位于点模型内随机点个数与全体随机点个数的比值乘以包围盒的体积算的。 3. 设计分析 3.1 串行算法设计 假定球体用B表示,半径r=1单位,B1是包含B的参考立方体(在本例中是边长为2的正方体),在B1中产生N个均匀分布的伪随机点。对每个随机点检测其是否在B内,假设位于B内的随机点个数为N(in)(<=N),应用蒙特卡洛算法,则B的体积为 V=V1(N(in)/N) 其中V1是B1的体积。如果产生足够多的随机点,理论上可以获得任意逼近精度。 算法描述如下: BEGIN N=_MAX; FOR I=0;I<_MAX;I++ X=RANDOM(); Y=RANDOM(); Z=RANDOM(); IF (X*X+Y*Y+Z*Z)<=1 COUNT++; END IF; END FOR; BULK=V1*(COUNT/_MAX); END; 本算法主要是在参考立方体的选取上和定义的_MAX的值对结果影响较大,所以应该选择合适的数。 3.2 并行算法设计 对FOR循环进行划分使用两个处理器完成计算。例如对一个长为n的序列,首先划分得到两个长为n/2的序列,将其交给两个处理器分别处理;而后进一步划分得到四个长为n/4的序列,再分别交给四个处理器处理;如此递归下去最终得到结果。当然这是理想的划分情况,如果划分步骤不能达到平均分配的目的,那么结果的效率会相对较差。 伪代码如下: BEGIN N=_MAX; FOR1 I=0;I<_MAX/2;I++ X1=RANDOM(); Y1=RANDOM(); Z1=RANDOM(); IF (X1*X1+Y1*Y1+Z1*Z1)<=1 COUNT1++; END IF; END FOR1; FOR2 I=_MAX/2+1;I<_MAX;I++ X2=RANDOM(); Y2=RANDOM(); Z2=RANDOM(); IF (X2*X2+Y2*Y2+Z2*Z2)<=1 COUNT2++; END IF; END FOR2; BULK=V1*((COUNT1+ COUNT2)/_MAX); END; 3.3 理论加速比分析 实验中大量数据所产生的加速比比小量数据所产生的加速比要体现得更明显,并且数据生成的并行加速比随着处理器核的增加而增加。设处理器个数为p,数据量为n,由于正常情况下该快速排序算法的复杂度为O(nlogn),并行处理的时间复杂度为O(klogk),其中k=n/p,所以并行算法的时间复杂度为O((n/p)log(n/p)),理论加速比为nlogn/((n/p)log(n/p))=p+logp. 4. 功能模块实现与最终结果分析 4.1 基于OpenMP的并行算法实现 4.1.1 主要功能模块与实现方法 利用了OpenMP里面的#omp parallel sections将对两个for循环用两个线程并行化执行,以多线程方式并行运行程序,并行的算法步骤如下: (1)初始化_max = 10000000; (2)创建两个线程; (3)由OpenMP编译指导语句控制产生并行执行代码区段; (4)将数据存放到tianqing_count; (5)各线程调用算法得出结果; 并行算法的部分代码如下: #pragma omp parallel for private(tianqing_x,tianqing_y,tianqing_z) reduction(+:tianqing_count2) for (tianqing_i = 0; tianqing_i<tianqing_max; tianqing_i++) { tianqing_x = rand(); tianqing_x = tianqing_x / 32767; tianqing_y = rand(); tianqing_y = tianqing_y / 32767; tianqing_z = rand(); tianqing_z = tianqing_z / 32767; if ((tianqing_x*tianqing_x + tianqing_y*tianqing_y + tianqing_z*tianqing_z) work1.pSumto(b, 0, MAXN - 1)); Thread newthread1 = new Thread(thread1); 创建Work类的对象work2; ThreadStart thread2 = new ThreadStart(() => work2.pSumto(c, 0, MAXN - 1)); Thread newthread2 = new Thread(thread2); stopwatch.Start(); 启动线程1和线程2; 等待进程结束; stopwatch.Stop(); 得到结果; 4.5.2 实验加速比分析 实验中创建了两个线程,通过多次测试,得出实验结果:由上面的理论加速比分析可知,当线程数为2时,理论加速比为2+log2=3.但由于实际操作中硬件设备以及内存分配的影响,实验加速比达不到理论值3.实验加速比在2.6~2.7左右。 4.6 并行计算技术在实际系统中的应用 4.6.1 主要功能模块与实现方法 该飞机订票系统主要实现了对机票的一些基本信息进行存储和管理的功能。在系统中实现了对机票信息的增删改查,考虑到查询的方便性,对机票按照航班号进行排序,而此排序方法用并行快速排序运用进来。利用OpenMP的并行技术,对机票信息按顺序排列好,并分析了实验过程中的加速比。 4.6.2 实验加速比分析 实验中创建了两个线程,通过多次测试,得出实验结果:当数据量比较大时,加速比理论在1.9左右。数据量较大时体现出来的加速比更准确。由上面的理论加速比分析可知,当线程数为2时,理论加速比为2+log2=3.但由于实际操作中硬件设备以及内存分配的影响,实验加速比达不到理论值3.实验加速比在2.2~2.4左右。 5. 设计体会 虽然没有按时完成作业,但这份报告花了我好几天的时间,从开始的搭建并行计算平台到最后的程序运行成功可以说是对我的一个锻炼。每一次的遇到问题与每一次的解决问题都是一个成长。每一次遇到问题和解决问题都是一种锻炼,一种尝试,从我们上并行计算课我懂得了很多电脑硬件和软件的知识,这些可能对于我们这个专业以后都是没有机会接触的,所以我觉得选择了并行计算与多核多线程技术这门课是非常正确的。对OpenMP、MPI、WIN32API、Java、.NET的并行技术有了一定的了解。在搭建MPI并行程序这块,学习的知识尤为增加,这些都是在不断的摸索、学习中学会的。 这次的大作业虽然是对以前实验的整合,但它加深了我对并行计算的印象,也使我对并行计算知识的理解更加深刻,也使我认识到了自己很多不足之处。学习并行计算的历程不会因为完成本次大作业而停止,我们是为了用知识武装大脑而学习,通过学习充实自己的生活,要努力学习,争取以后能够完成规模更大的程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值