<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Python學習筆記九

      Python學習筆記之九

      為什么要有操作系統

        管理硬件,提供接口。

        管理調度進程,并且將多個進程對硬件的競爭變得有序。

      操作系統發展史

        第一代計算機:真空管和穿孔卡片

               沒有操作系統,所有的程序設計直接操控硬件

               優點:程序員獨享整個資源

                 缺點:浪費資源

        第二代計算機:晶體管和批處理系統

               優點:計算機資源利用

               缺點:程序員共享資源,出現問題,找不出問題,影響開發效率

        第三代計算機:集成電路芯片和多道程序設計

               多道程序:cpu執行程序的過程中遇到I/O,不會原地等待,cpu會去執行其他命令,等到程序執行完I/O.(時間上的復用)

                    實現一個看起來像并發。CPU隨時切換進程。會影響CPU執行效率。

                                 進程占用一個內存空間,每個進程的內存空間,是隔離的。(空間上的復用)

        第四代計算機:個人計算機

      多道技術:

        產生背景:針對單核,實現并發。

        空間復用:內存空間是隔離的

        時間復用:遇到I/O就切,提高效率

             遇到運行時間過長,不提高效率

               

      并發與并行

        并發:偽并行,單個CPU+多道技術,看起來像同時運行。

        并行:多個CPU才能實現并行

      windows和linux創建進程:

        windows: createprocess創建進程的接口

        linux: fork創建進程的接口

        創建子進程:

          linux:子進程是父進程的完整副本,

          windows:父進程與子進程的內存地址有所不同

          

      進程狀態:

        運行

        阻塞:碰到I/O,便要讓出CPU讓其他進程執行,保證CPU一直在工作。

        就緒:時刻準備著運行

        

      開啟進程的兩種方式:

        為什么開啟子進程就實現了并發?

        開啟子進程就為了執行自己的任務,而不會因為父進程阻塞,而影響自己。

      開啟子進程的第一種方法:

      from multiprocessing import Process
      import
      time,random def piao (name): print('%s is piaoing' %name) # time.sleep(3000) if __name__ == '__main__': # p=Process(target=piao,args=('alex',)) p=Process(target=piao,kwargs={'name':'alex'}) p.start() #向操作系統發送開啟子進程的信號 # p.join() print ('主進程')
      結果:

      "D:\Program Files\Python36\python.exe" C:/Users/yangjianbo/PycharmProjects/untitled/第九課并發編程/開啟子進程.py
      主進程
      alex is piaoing

      結論:

      p.start() 只是向操作系統發出一個開啟子進程的信號,而不是真正的開啟子進程。

      當p.start()執行完以后,會立刻執行下一行代碼,也就是print(),而不是等待子進程執行后,再執行print(). 

      p.start()只能執行一次,多次會有報錯。

       上面的例子:如果我想要子進程執行完畢以后,再執行print(),如何實現?

      子進程執行完,再執行主進程的代碼。

      from multiprocessing import Process
      import time,random
      def piao (name):
            print('%s is piaoing' %name)
            # time.sleep(3000)
      if __name__ == '__main__':
            # p=Process(target=piao,args=('alex',))
            p=Process(target=piao,kwargs={'name':'alex'})
            p.start()     #向操作系統發送開啟子進程的信號
            p.join()
            print ('主進程')
      結果:

      "D:\Program Files\Python36\python.exe" C:/Users/yangjianbo/PycharmProjects/untitled/第九課并發編程/開啟子進程.py
      alex is piaoing
      主進程

      結論:在p.start()后面添加一個p.join(),主進程就會在當前位置停下,等待子進程運行完成,再執行后面的代碼。p.join()必須在p.start()的后面,否則子進程還未開啟,p.join()也沒有意義。這么做的意義就是為了防止主進程突然關閉,而導致子進程執行完畢以后,成為了僵尸進程。

       開啟子進程的第二種方法:

      采用自定義類的方式。

      from multiprocessing import Process
      import time,random
      class Myprocess(Process):
            def __init__(self,name):
                  super(Myprocess,self).__init__()
                  self.name=name
            def run(self):
                  print ('%s is piaoing' %self.name)
      
      if __name__ == '__main__':
          p=Myprocess('alex')
          p.start()
          print('')

       

      套接字通信開啟子進程

      服務端:

      from socket import socket
      from multiprocessing import Process
      def tongxin(conn,addr):
          while True:
              try:
                  cmd = conn.recv(1024)  # 收消息,限制單個消息的最大數為1024字節
                  if not cmd: break
                  conn.send(cmd.upper())
              except ConnectionResetError:
                  break
          conn.close()
      def lianjie():
          s = socket()
          s.bind(('127.0.0.1', 8080))  # 插卡,指定服務器的IP地址和端口號
          s.listen(5)
          while True:
              conn, client_addr = s.accept()
              p=Process(target=tongxin,args=(conn,client_addr))
              p.start()
          s.close()
      
      if __name__ == '__main__':
          lianjie()

      客戶端:

      import socket
      client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      client.connect(('127.0.0.1',8080))      #打電話
      
      while True:
          cmd=input('數據>>').strip()
          if not cmd:continue
          client.send(cmd.encode('utf-8'))    #發消息
          recv=client.recv(1024).decode('gbk')       #收消息
          print(recv)
      
      client.close()

       

      進程對象的其他方法:

      join方法:

      from multiprocessing import Process
      import time,random
      def piao (name):
            print('%s is piaoing' %name)
      
      if __name__ == '__main__':
            p1=Process(target=piao,args=('alex',))
            p2=Process(target=piao,args=('egon',))
            p3 = Process(target=piao, args=('wupaiqi',))
            p1.start()
            p2.start()
            p3.start()
      
            p1.join()
            p2.join()
            p3.join()
            print ('主進程')
      結果:

      "D:\Program Files\Python36\python.exe" C:/Users/yangjianbo/PycharmProjects/untitled/第九課并發編程/進程的其他對象方法.py
      egon is piaoing
      alex is piaoing
      wupaiqi is piaoing
      主進程

      結論:

      三個start()都是隨機開啟的,不會按順序啟動的。

      三個join要放在三個start的后面,這樣才是并發。

       

      from multiprocessing import Process
      import time,random
      def piao (name):
            print('%s is piaoing' %name)
      
      if __name__ == '__main__':
            p1=Process(target=piao,args=('alex',))
            p2=Process(target=piao,args=('egon',))
            p3 = Process(target=piao, args=('wupaiqi',))
            p1.start()
            p1.join()
            p2.start()
            p2.join()
            p3.start()
            p3.join()
            # p1.join()
            # p2.join()
            # p3.join()
            print ('主進程')
      結果:

      "D:\Program Files\Python36\python.exe" C:/Users/yangjianbo/PycharmProjects/untitled/第九課并發編程/進程的其他對象方法.py
      alex is piaoing
      egon is piaoing
      wupaiqi is piaoing
      主進程

      結論:

      如果是這么寫的,就是真正的串行。

       

      from multiprocessing import Process
      import time,random
      def piao (name):
            print('%s is piaoing' %name)
      
      if __name__ == '__main__':
            p1=Process(target=piao,args=('alex',))
            p2=Process(target=piao,args=('egon',))
            p3 = Process(target=piao, args=('wupaiqi',))
            p_l=[p1,p2,p3]
            for p in p_l:
                p.start()
            for p in p_l:
                p.join()
            print ('主進程')

       

      進程之間的內存空間是隔離的

      from multiprocessing import Process
      n=100
      def task():
          global  n
          n=0
          print (n)
      if __name__ == '__main__':
          p=Process(target=task)
          p.start()
          p.join()
          print('',n)
      結果:

      "D:\Program Files\Python36\python.exe" C:/Users/yangjianbo/PycharmProjects/untitled/第九課并發編程/進程之間的內存空間是隔離的.py
      0
      主 100

      結論:

      進程之間的內存空間是隔離的,因為我修改了子進程的n,但是主進程的n還是原來的。

       

      查看進程的pid和ppid。

      殺死進程

      進程池

       

       

                    

              

      posted @ 2017-11-16 22:04  奮斗史  閱讀(131)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久国内精品一区二区三区 | 泸溪县| 亚洲AV日韩AV激情亚洲| 国产精品一区二区三粉嫩| 久久精品国产字幕高潮| 亚洲嫩模喷白浆在线观看| 久久av色欲av久久蜜桃网| 亚洲一二区制服无码中字| a∨变态另类天堂无码专区| 亚洲一区在线观看青青蜜臀| 亚洲精品美女一区二区| 性欧美三级在线观看| 久久天天躁狠狠躁夜夜躁| 国产麻豆一区二区精彩视频| 天美传媒mv免费观看完整| 亚洲夂夂婷婷色拍ww47| 欧洲亚洲成av人片天堂网| 国产中文字幕在线一区| 精品久久欧美熟妇www| 在线播放国产精品三级网| 午夜国产理论大片高清| 久久久久久亚洲精品a片成人| 香蕉久久久久久久av网站| 中文字幕人妻av第一区| 久久精品国产亚洲av麻豆小说| 亚洲中文字幕伊人久久无码| 精品人妻蜜臀一区二区三区| 五月综合网亚洲乱妇久久| 日韩精品久久久肉伦网站| 在线观看成人av天堂不卡| 精品人妻一区二区三区蜜臀 | 日韩中文字幕一区二区不卡| 日本阿v片在线播放免费| 成人午夜精品无码区久久| 国产精品自拍实拍在线看| 国内精品自线在拍| 亚洲va中文字幕无码久久| 日韩一区二区三在线观看| 国产精品大全中文字幕| 欧洲lv尺码大精品久久久| 成人国产亚洲精品一区二区|