Dreamingk Alone

看时间流过
文章 - 10,收藏 - , 评论 - 18, trackbacks - 1

导航

公告


    我好冷,我控制不住发抖的
  身体。请原谅我!


    本blog除标明转载的文章之外,其他所有文字皆为原创,如要转载请注名作者出处,特此声明
                -- Dreamingk

文章

收藏

    相册

      Python

        PythonIc

          存档


          正在读取评论……

          2005年03月


              由于不太喜欢csdn的blog服务,还有donews的blog服务最近不稳定,特决定以后只更新两个blog,如下:

              Dreamingk Alone at miex.org http://www.miex.org/dreamingk

              Dreamingk Alone at Sina http://blog.sina.com.cn/blog/1401337701 (test)

              我会坚持更新blog的,否则就真成了挖坑不埋了:)

                                                                             ---- Pythonic Dreamiingk




              子曰:巧言令色鲜亦仁

              “巧言”就是很能侃、很能吹。仁义道德讲的头头是道,却从不这样脚踏实地的做,言行不一。“令色”是态度很仁义,但却是假的。“鲜亦仁”就是很少做到“仁”这个学问的境界。所以做学问是要踏实的。

              “巧言令色”作为工具的时候都是有目的的,并且不一定都是那么表面化的“巧言令色”。所谓“上有好者,下必甚焉”,你说你很讲原则,不为名、不要钱,只是爱好琴棋书画,那就有人带着“家藏墨宝”、“古书典籍”来跟你交流。你看在赖氏的经典名言“不怕你讲原则,就怕你没爱好”的指导下,多少国家大员都被同流合污了。

              曾子曰:吾日三省吾身,为人谋而不忠乎?与朋友交而不信乎?传不习乎?

              曾子是孔子学生,名参,少孔子四十六岁,他著《大学》,原本是《礼记》里的一篇,唐宋时候把拉出来做为四书之一。后来孔子孙子子思著《中庸》也是跟他学的。所以《大学》、《中庸》并不能说代表了孔子思想。而孟子是子思的学生,孔子三传弟子,这时是战国时代,他的思想和孔子多少有些出入。所以这也代表文化思想的演变与时代有关。

              曾子说他这个人做学问,每天用三件事情考察自己。

              “为人谋而不忠乎”,替人家做事情有没有尽心尽力。古代“忠”是指对人对事无不尽心的态度。

              “与朋友交而不信乎?”,与朋友是不是言而有信。就是我答应人家的时候都做了吗?

              “传不习乎?”,老师教我如何做人做事,我真正去实践了没?

              如果我们每天自省,用这三个事情来考察自己,就可以明了我们自己是如何做学问的,做的怎么样?要以做人做事体会出来,这就是学问,只是太难了。

              学问讲到这里,都是个人修养。但是学问不是只讲个人修养的。扩而充之就是社会问题、政治问题。我们上面讲的都是学问的内涵。

              子曰:道千乘之国,敬事而信,节用而爱人,使民以时。

              “道”,是领导的导,就是领导之德、领导的修养。

              “国”,在秦汉以上是地方政治单位的名称,不是指现代的“国家”。

              “乘”,古代以战车、壮丁、田赋等合在一起计算的,算是个计量单位吧。

              “千乘之国”,算是比较大的地方政治单位了。

              “敬事而信”,对一件事情认真做为“敬事”。一项职务宁可不接受,接受了就要认真做。“信”就是使下面的人信服。可见如果要取信于人,就要“敬事”,说了的话一定要兑现,身先士卒。

              “节用而爱人”,节用指经济政策的措施一定要节省。节省的目的是为了“爱人”。

              “使民以时”,用人要把握好时间。用人要得当,这样才能人尽其用。不光在用人上,还在为人的道德上,比如部下重病,要懂得“爱人”,而不是责备他为什么不来上班。所以用人不仅是方式方法,还是道德修养,也是学问。

               这整句话便是孔子做学问的目的、态度和方法的记录。





              我们经常会采用生产者/消费者关系的两个线程来处理一个共享缓冲区的数据。例如一个生产者线程接受用户数据放入一个共享缓冲区里,等待一个消费者线程对数据取出处理。但是如果缓冲区的太小而生产者和消费者两个异步线程的速度不同时,容易出现一个线程等待另一个情况。为了尽可能的缩短共享资源并以相同速度工作的各线程的等待时间,我们可以使用一个“队列”来提供额外的缓冲区。

              创建一个“队列”对象

              import Queue
              myqueue = Queue.Queue(maxsize = 10)

              Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。

              将一个值放入队列中

              myqueue.put(10)

              调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。如果队列当前为空且block1put()方法就使调用线程暂停,直到空出一个数据单元。如果block0put方法将引发Full异常。

              将一个值从队列中取出

              myqueue.get()

              调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为1。如果队列为空且block1get()就使调用线程暂停,直至有项目可用。如果block为0,队列将引发Empty异常。

              我们用一个例子来展示如何使用Queue

          # queue_example.py
          from Queue import Queue
          import threading
          import random
          import time

          # Producer thread
          class Producer(threading.Thread):
              def __init__(self, threadname, queue):
                  threading.Thread.__init__(self, name = threadname)
                  self.sharedata = queue
              def run(self):
                  for i in range(20):
                      print self.getName(),'adding',i,'to queue'
                      self.sharedata.put(i)
                      time.sleep(random.randrange(10)/10.0)
                  print self.getName(),'Finished'

          # Consumer thread
          class Consumer(threading.Thread):
              def __init__(self, threadname, queue):
                  threading.Thread.__init__(self, name = threadname)
                  self.sharedata = queue
              def run(self):
                  for i in range(20):
                      print self.getName(),'got a value:',self.sharedata.get()
                      time.sleep(random.randrange(10)/10.0)
                  print self.getName(),'Finished'

          # Main thread
          def main():
              queue = Queue()
              producer = Producer('Producer', queue)
              consumer = Consumer('Consumer', queue)

              print 'Starting threads ...'
              producer.start()
              consumer.start()

              producer.join()
              consumer.join()

              print 'All threads have terminated.'

          if __name__ == '__main__':
              main()

              示例代码中实现了两个类:生产者类Producer和消费者类Consumer。前者在一个随机的时间内放入一个值到队列queue中然后显示出来,后者在一定随机的时间内从队列queue中取出一个值并显示出来。





              多个执行线程经常要共享数据,如果仅仅读取共享数据还好,但是如果多个线程要修改共享数据的话就可能出现无法预料的结果。

              假如两个线程对象t1t2都要对数值num=0进行增1运算,那么t1t2都各对num修改10次的话,那么num最终的结果应该为20。但是如果当t1取得num的值时(假如此时num0),系统把t1调度为“sleeping”状态,而此时t2转换为“running”状态,此时t2获得的num的值也为0,然后他把num+1的值1赋给num。系统又把t2转化为“sleeping”状态,t1为“running”状态,由于t1已经得到num值为0,所以他也把num+1的值赋给了num1。本来是2次增1运行,结果却是num只增了1次。类似这样的情况在多线程同时执行的时候是有可能发生的。所以为了防止这类情况的出现就要使用线程同步机制。

              最简单的同步机制就是“锁”

              锁对象用threading.RLock类创建

              mylock = threading.RLock()

              如何使用锁来同步线程呢?线程可以使用锁的acquire() (获得)方法,这样锁就进入“locked”状态。每次只有一个线程可以获得锁。如果当另一个线程试图获得这个锁的时候,就会被系统变为“blocked”状态,直到那个拥有锁的线程调用锁的release() (释放)方法,这样锁就会进入“unlocked”状态。“blocked”状态的线程就会收到一个通知,并有权利获得锁。如果多个线程处于“blocked”状态,所有线程都会先解除“blocked”状态,然后系统选择一个线程来获得锁,其他的线程继续沉默(“blocked”)。

          import threading
          mylock = threading.RLock()
          class mythread(threading.Thread)
              ...
              def run(self ...):
                  ...     #此处 不可以 放置修改共享数据的代码
                  mylock.acquire()
                  ...     #此处 可以 放置修改共享数据的代码
                  mylock.release()
                  ...    
          #此处 不可以 放置修改共享数据的代码

              我们把修改共享数据的代码称为“临界区”,必须将所有“临界区”都封闭在同一锁对象的acquire()release()方法调用之间。

              锁只能提供最基本的同步级别。有时需要更复杂的线程同步,例如只在发生某些事件时才访问一个临界区(例如当某个数值改变时)。这就要使用“条件变量”。

              条件变量用threading.Condition类创建

              mycondition = threading.Condition()

              条件变量是如何工作的呢?首先一个线程成功获得一个条件变量后,调用此条件变量的wait()方法会导致这个线程释放这个锁,并进入“blocked”状态,直到另一个线程调用同一个条件变量的notify()方法来唤醒那个进入“blocked”状态的线程。如果调用这个条件变量的notifyAll()方法的话就会唤醒所有的在等待的线程。

              如果程序或者线程永远处于“blocked”状态的话,就会发生死锁。所以如果使用了锁、条件变量等同步机制的话,一定要注意仔细检查,防止死锁情况的发生。对于可能产生异常的临界区要使用异常处理机制中的finally子句来保证释放锁。等待一个条件变量的线程必须用notify()方法显式的唤醒,否则就永远沉默。保证每一个wait()方法调用都有一个相对应的notify()调用,当然也可以调用notifyAll()方法以防万一。





              大家小时侯凡是上过中学的大概都学过《学而》这篇文章,里面最经典的莫过于:

              子曰:学而时习之,不亦说乎?

              有朋自远方来,不亦乐乎?

              人不知而不愠,不亦君子乎?

              老师都给我们讲过这几句话的含义,但是南老先生却提出了疑义,让我们来明辨一下

              第一句的重点在时间的“时”和见习的“习”上。

              如果读过孔子全部著述并了解了孔子的全部思想的话,就知道什么叫做学问。学问不是文章,是从做人做事上体会的一种修养,书上读是读不出来的。随时随地的生活都是我们的书本,都是我们的教育。孔子说“观过而知仁”,意思是我们看见人家犯了错误,自己便反省,我不要犯这个错误,这就是“学问”。这个方法就是要随时随地的思想、见习、体验、反省。但是刚开始反省时也不容易,后来慢慢有了进步自然会不亦说乎,“说”就是会心的微笑。可见不是今天我们读《论语》就叫做学问,明天不读就不叫做学问。

              从这里看来,孔子认为人的修养、人的知识都是从生活的行动过程中悟来的、反省来的,而不是“一心只读圣贤书”读出来的,也不是考试考出来的。如果中国的教育体制仅仅还只是社会建设选拔人才的机制的话,那么中国的人文精神将不会有所建设。还有随时随地的学习也是和我们现在提倡的终身学习时刻学习具有同样意义的。现代信息社会,信息更新速度太快,社会发展变革太快,生活环境变化太快,不能够及时的更新知识结构是不能够适应这样千变万化的社会。所以终身学习、随时学习真的是非常必需的。只是很多人都把技能培养放在首位,殊不知,没有思想没有修养的人在面对这样纷繁的物质世界时不怕心智失衡吗?

              孔子认为即使一个安定的社会,文化教育没有完成,是不能解决其他问题的。因此他一生宁可穷苦,从事教育。一个思想家,一个不为穷苦折腰的人,最看重的人当然是知己。有句老话:“人生得一知己,死而无憾。可见一个知己、一个知心朋友来看望孔子的话,他有多么高兴。当然古代人们消息闭塞,传播知识的效率也低,远不及现在有电话、手机、internet。所以只要不是整天碰面的人,联系起来都是非常远的。这样我们就可以理解第二句话了。

              第三句是说一个人碰到艰难困苦、遇到重大打击,不要“怨天尤人”。老天爷是最无辜的,不要怨他,而要反省自己,为什么我站不起来?为什么我没有达到这个目的?是自己的学问、修养、做法种种的问题。这才是健康的心理,拿现代的新观念来讲,就是讲究人生哲学的开始。

              其实经常看到有些书讲的都是处世哲学,讲的无非是“圆融贯通”、“八面玲珑”。其实所谓立身处世如果仅仅站在一个狭隘的立场上真的和哲学是格格不入的。我是从来不去读此书的,因为即便你真的把那些东西做为你立身处世的根本的话,那么在生活中去体验“圆融贯通”、“八面玲珑”远比那么些“处世哲学”讲的深切的多,至少我是深有体会。当然这也算验证了孔子学从习中来的道理。

              我们连贯上面三句话就晓得读书作学问的修养,自始至终,无非要先能自得其乐,然后才能“后天下之乐而乐”。明代陈眉公说:“如何是独乐乐?曰:无事此静坐,一日是两日。如何是与人乐乐?曰:与君一席话,胜读十年书。如何是众乐乐?曰:此中空洞原无物,何止容卿数百人。”有此胸襟,有此气度,也自然可以做到“人不知而不愠”了。不然,知识愈多,地位愈高,既不能忘形得意,也不能忘形失意,那便成为“直到天门最高处,不能容物只容身”了。

              有子曰:其为人也孝弟,而好犯上者鲜矣;不好犯上而好作乱者,未之有也。君子务本,本立而道生;孝弟也者,其为人之本与?

              若要理解这句话,首先要了解什么是“孝弟”

              “孝”大家都应该清楚的,就是对父母的爱。其实“父慈子孝”这是相对的。父亲对儿子付出了慈爱,儿子回过头来爱父亲就是孝。过去的中国文化是大家庭制度,有宗族、有祠堂,所谓五世同堂,聚族而居。大家庭固然有许多小毛病,但也有它的好处,像宗族的发展,即由此而起,这是孝道的精神。

              “弟”就难理解了。其实有句话“兄友弟恭”,哥哥对弟弟好,弟弟自然爱哥哥。那么我认为“弟”就可以理解为“以弟自居”,再延伸就是兄弟姊妹的友爱。中国的五伦有君臣、父子、夫妇、兄弟、朋友。这五伦中四伦都讲得通,为什么加朋友这一伦?朋友是一种感情的结合,这是中国文化的特殊处,这个“弟”就包括了对兄弟、姊妹,一直到朋友,伸展到社会的友情。

              中国文化中的“感情力量”是巨大的,尤其是宗族的力量以及“友道”形成特殊结合。所以“孝弟”的人是不会犯上作乱的。

              学问的根本是什么呢?“君子务本”。文学好,知识渊博,那是枝节的,学问之道在自己作人的根本上,人生的建立,内心的修养。所以“本立而道生”,学问的根本,在培养这个孝悌,孝悌不是教条。换句话说,培养人性光辉的爱,“至爱”、“至情”的这一面,所谓“孝弟也者,其为人之本与。”他说这个是“人”的本。

              看了这些我们可以理解这句话就是说:一个有真性情对每个人都有感情的人,就不会犯上作乱,不会犯上却还会作乱的,这是不可能的,因为这种人有分寸、有限度。学问之道在自己作人的根本上,人生的建立,内心的修养。所以培养人性光辉的爱,就是为人的根本。