def __init__(self):
wx.Frame.__init__(self, parent=None, -1,””)
row = 3
col = 3
hgap = 3
vgap = 3
sizer = wx.GridSizer(row, col, hgap, vgap)
for label in labels:
frameWin = FrameWin(self, label=label)
sizer.Add(frameWin, 0, 0)
self.SetSizer(sizer)
事件驱动编程
事件驱动程序是一种控制结构,它接受事件,并响应他们。WxPython的结构和一般的Python脚本不同。事件驱动系统的主循环如同死循环一般,一直在等待事件的发生,一旦事件后,系统开始响应这个过程,然后将足够的资源分派给这个事件,结束后继续等待下一个事件。在初始化之后,执行mainloop()后,程序就进入一个空闲的循环,等待用户的交互,直到退出这个循环。
图4-4 WxPython事件处理过程图
从上述处理过程图中可以将处理过程分为四大步骤:
发生事件
解析事件并进行触发前的策略
响应事件并找到响应对象
判断是否继续处理、判断是否Skip
在时间流程中含有Skip事件可以进行其他流程的相应事件。在程序设计中有大量的
事件必须进行Skip处理如:鼠标按下事件以及按钮单击事件。在执行完第三个步骤后如果有Skip,则继续响应Skip中的事件,课题中常用validate函数先进行判断相关操作是否正常:
def OnMouseDown(self, event):
validate()
event.Skip()
多线程的WxPython
在图形界面程序中,在应用程序后台可能长期执行一个处理过程而不会影响用户其他的操作,对用户的体验非常有好处,因此允许后台产生一个线程并在线程中长期处理是必须的。
使用WxPython的全局函数CallAfter(),该函数可以传递消息给主线程,使得主线程在当前事件处理结束后可以对不同的线程调用函数。值得注意的是该函数总是在主线程中执行。使用Python的threading模块,在线程结束时使用threadfinisher()。本课题使用队列对象来管理线程的通信,为线程通信设置了一个并行的队列,当工作线程增加一个命令对象到队列时会调用wakeupidle()确保存在空闲事件。这个机制保证了后台线程间的通信,并且图形界面的处理扔在主线程中。
Hadoop关键技术
MapReduce编程
Hadoop通过把作业分成若干个小任务来工作,其中包括两种类型的任务:map任务和reduce任务。有两种类型的结点控制作业的执行:jobtracker和tasktracker。Jobtracker通过调度任务在tasktracker上运行,协调系统上所有的作业。而map任务是作为中间输出,将处理结果写入本地的硬盘,然后当做reduce的输入。一旦作业完成,map的输出便可以删除。Reduce则是将有序的map输出进行合并,进行自定义的reduce函数,然后输出到hdfs中。
图4-5简单的MapReduce示意图
在Mrjob框架下,并结合数据挖掘系统设计,进行MapReduce操作只需要完成如下代码的详细实现: Python基于hadoop的大规模并行数据分析系统原型设计(11):http://www.youerw.com/jisuanji/lunwen_2653.html