亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python&&ftp上傳和多線程開(kāi)發(fā)&&學(xué)習(xí)筆記

系統(tǒng) 1966 0

python&&ftp上傳和多線程開(kāi)發(fā)&&學(xué)習(xí)筆記

    • FTP文件上傳
      • FTP文件上傳示例
      • 堡壘機(jī)程序示例
      • SSH密碼賬號(hào)遠(yuǎn)程登錄服務(wù)器示例
      • SSH密鑰遠(yuǎn)程登錄服務(wù)器示例
      • SSH上傳和下載文件
    • 線程與進(jìn)程簡(jiǎn)介
      • 應(yīng)用程序、進(jìn)程、線程的關(guān)系
      • 簡(jiǎn)單創(chuàng)建線程示例1
      • 多線程開(kāi)發(fā)的方法
      • 多線程之方法應(yīng)用示例
      • 多線程之自定義線程類示例
      • 多線程之生產(chǎn)者與消費(fèi)者模型示例一
      • 函數(shù)式編程實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者模型
      • 多線程開(kāi)發(fā)之線程鎖
      • 多線程開(kāi)發(fā)之event事件

FTP文件上傳

FTP文件上傳示例

示例框架
python&&ftp上傳和多線程開(kāi)發(fā)&&學(xué)習(xí)筆記_第1張圖片
server.py(運(yùn)行異常,僅參考)

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                #導(dǎo)入模塊socketserver,利用多線程實(shí)現(xiàn)多個(gè)用戶同時(shí)上傳下載文件
              
              
                import
              
               socketserver

              
                import
              
               os 

              
                from
              
               test
              
                .
              
              test_decimal 
              
                import
              
              
                file
              
              
                class
              
              
                myServer
              
              
                (
              
              socketserver
              
                .
              
              BaseRequestHandler
              
                )
              
              
                :
              
              
                def
              
              
                handle
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                #定義文件存放根路徑
              
              
        basePath 
              
                =
              
              
                'D:/backupAll\eclipseRoot\temp'
              
              
        clientObj 
              
                =
              
               self
              
                .
              
              request
        
              
                print
              
              
                (
              
              
                '連接成功...'
              
              
                )
              
              
                while
              
              
                True
              
              
                :
              
              
                #獲取發(fā)送頭信息
              
              
            preData 
              
                =
              
               clientObj
              
                .
              
              recv
              
                (
              
              
                1024
              
              
                )
              
              
            preDataToStr 
              
                =
              
              
                str
              
              
                (
              
              preData
              
                ,
              
               encoding 
              
                =
              
              
                "utf8"
              
              
                )
              
              
                print
              
              
                (
              
              preDataToStr
              
                )
              
              
            cmd
              
                ,
              
              fileName
              
                ,
              
              fileSize 
              
                =
              
               preDataToStr
              
                .
              
              split
              
                (
              
              
                '|'
              
              
                )
              
              
            recvSize 
              
                =
              
              
                0
              
              
                #拼接路徑
              
              
            fileDir 
              
                =
              
               os
              
                .
              
              path
              
                .
              
              join
              
                (
              
              basePath
              
                ,
              
              fileName
              
                )
              
              
            f 
              
                =
              
              
                file
              
              
                (
              
              fileDir
              
                ,
              
              
                'wb'
              
              
                )
              
              
            Flag 
              
                =
              
              
                True
              
              
                while
              
               Flag
              
                :
              
              
                if
              
              
                int
              
              
                (
              
              fileSize
              
                )
              
              
                >
              
               recvSize
              
                :
              
              
                    data 
              
                =
              
               clientObj
              
                .
              
              recv
              
                (
              
              
                1024
              
              
                )
              
              
                    recvSize 
              
                +=
              
              
                len
              
              
                (
              
              data
              
                )
              
              
                else
              
              
                :
              
              
                    recvSize 
              
                =
              
              
                0
              
              
                    FLag 
              
                =
              
              
                False
              
              
                #數(shù)據(jù)由內(nèi)存寫入硬盤
              
              
                f
              
                .
              
              write
              
                (
              
              data
              
                )
              
              
                print
              
              
                (
              
              
                '上傳完畢'
              
              
                )
              
              
                
instance 
              
                =
              
               socketserver
              
                .
              
              ThreadingTCPServer
              
                (
              
              
                (
              
              
                '127.0.0.1'
              
              
                ,
              
              
                9999
              
              
                )
              
              
                ,
              
              myServer
              
                )
              
              
instance
              
                .
              
              serve_forever
              
                (
              
              
                )
              
            
          

client.py

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                #由于文件的發(fā)送傳輸需要經(jīng)過(guò)緩沖區(qū),緩沖區(qū)大小固定(一般為8096),所以在實(shí)現(xiàn)對(duì)文件的發(fā)送傳輸時(shí)需要將文件切割成固定大小發(fā)送。
              
              
                #導(dǎo)入模塊
              
              
                from
              
               pip
              
                .
              
              _vendor
              
                .
              
              distlib
              
                .
              
              compat 
              
                import
              
              
                raw_input
              
              
                from
              
               test
              
                .
              
              test_decimal 
              
                import
              
              
                file
              
              
                import
              
                socket

              
                import
              
               os




              
                #定義變量
              
              
ipAddress 
              
                =
              
              
                (
              
              
                "127.0.0.1"
              
              
                ,
              
              
                9999
              
              
                )
              
              
socketObj 
              
                =
              
               socket
              
                .
              
              socket
              
                (
              
              
                )
              
              
socketObj
              
                .
              
              connect
              
                (
              
              ipAddress
              
                )
              
              
                #創(chuàng)造重復(fù)循環(huán)
              
              
                while
              
              
                True
              
              
                :
              
              
                #接收"文件操作命令(上傳(put)、下載(get))|文件路徑"
              
              
                input
              
              
                =
              
              
                raw_input
              
              
                (
              
              
                'path:'
              
              
                )
              
              
                #分離存放文件操作命令(上傳、下載)和文件路徑
              
              
    cmd
              
                ,
              
              path 
              
                =
              
              
                input
              
              
                .
              
              split
              
                (
              
              
                '|'
              
              
                )
              
              
                #定義文件名稱
              
              
    fileName 
              
                =
              
               os
              
                .
              
              path
              
                .
              
              basename
              
                (
              
              path
              
                )
              
              
                #定義文件大小
              
              
    fileSize 
              
                =
              
               os
              
                .
              
              stat
              
                (
              
              path
              
                )
              
              
                .
              
              st_size
    strOne 
              
                =
              
               cmd
              
                +
              
              
                "|"
              
              
                +
              
              fileName
              
                +
              
              
                "|"
              
              
                +
              
              
                str
              
              
                (
              
              fileSize
              
                )
              
              
    strToBit 
              
                =
              
               strOne
              
                .
              
              encode
              
                (
              
              encoding
              
                =
              
              
                'utf_8'
              
              
                ,
              
               errors
              
                =
              
              
                'strict'
              
              
                )
              
              
                #發(fā)送消息到
              
              
    socketObj
              
                .
              
              send
              
                (
              
              strToBit
              
                )
              
              
                #文件發(fā)送進(jìn)度
              
              
    sendSize 
              
                =
              
              
                0
              
              
    f 
              
                =
              
              
                file
              
              
                (
              
              path
              
                ,
              
              
                'rb'
              
              
                )
              
              
    Flag 
              
                =
              
              
                True
              
              
                while
              
               Flag
              
                :
              
              
                #如果文件發(fā)送剩余大小不足1024,則讀取發(fā)送剩余大小數(shù)據(jù)并結(jié)束重復(fù)循環(huán)
              
              
                if
              
               sendSize 
              
                +
              
              
                1024
              
              
                >
              
               fileSize
              
                :
              
              
            data 
              
                =
              
               f
              
                .
              
              read
              
                (
              
              fileSize 
              
                -
              
               sendSize
              
                )
              
              
            Flag 
              
                =
              
              
                False
              
              
                #否則,讀取發(fā)送固定大小文件數(shù)據(jù)并記錄w文件發(fā)送進(jìn)度
              
              
                else
              
              
                :
              
              
            data 
              
                =
              
               f
              
                .
              
              read
              
                (
              
              
                1024
              
              
                )
              
              
            sendSize 
              
                +=
              
              
                1024
              
              
        f
              
                .
              
              close
              
                (
              
              
                )
              
              
socketObj
              
                .
              
              close
              
                (
              
              
                )
              
            
          

堡壘機(jī)程序示例

需求 :記錄用戶在服務(wù)器的所有操作
1.需要一臺(tái)主機(jī)當(dāng)做堡壘機(jī)
2.所有用戶只能登陸堡壘機(jī)
3.登陸堡壘機(jī)后,可以遠(yuǎn)程服務(wù)器進(jìn)行操作
4.記錄用戶的所有操作
過(guò)程 :登陸堡壘機(jī)》選擇服務(wù)器》操作服務(wù)器:記錄操作
實(shí)現(xiàn)過(guò)程
1.創(chuàng)建堡壘機(jī)用戶

            
            
          

2.用戶登陸堡壘機(jī)后

SSH密碼賬號(hào)遠(yuǎn)程登錄服務(wù)器示例

sshDemo.py

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                #導(dǎo)入模塊
              
              
                import
              
               paramiko

              
                #實(shí)例化
              
              
ssh 
              
                =
              
               paramiko
              
                .
              
              SSHClient
              
                (
              
              
                )
              
              
                #應(yīng)對(duì)第一個(gè)遠(yuǎn)程登錄的用戶簽名(yes or no),該行代碼默認(rèn)填寫yes。
              
              
ssh
              
                .
              
              set_missing_host_key_policy
              
                (
              
              paramiko
              
                .
              
              AutoAddPolicy
              
                (
              
              
                )
              
              
                )
              
              
                #遠(yuǎn)程登錄賬號(hào),密碼
              
              
ssh
              
                .
              
              connect
              
                (
              
              
                '192.168.1.223'
              
              
                ,
              
              
                22
              
              
                ,
              
              
                'root'
              
              
                ,
              
              
                'yibotong'
              
              
                )
              
              
                #設(shè)置需要使用Linux命令并捕捉命令返回結(jié)果(輸入,輸出,錯(cuò)誤)
              
              
stdin
              
                ,
              
              stdout
              
                ,
              
              stderr 
              
                =
              
               ssh
              
                .
              
              exec_command
              
                (
              
              
                'df'
              
              
                )
              
              
                #打印結(jié)果
              
              
                print
              
              
                (
              
              stdout
              
                .
              
              read
              
                (
              
              
                )
              
              
                )
              
              
ssh
              
                .
              
              close
              
                (
              
              
                )
              
              
                ;
              
            
          

SSH密鑰遠(yuǎn)程登錄服務(wù)器示例

服務(wù)器操作生成密鑰操作

            
              
                #ssh命令產(chǎn)生密鑰對(duì)
              
              
ssh-keygen -t rsa

              
                #將本地公鑰復(fù)制到遠(yuǎn)程服務(wù)器內(nèi)部(/root/.ssh/id_rsa.pub)
              
              
ssh-copy-id root@192.168.1.139

            
          

python密鑰登錄

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                #導(dǎo)入模塊
              
              
                import
              
               paramiko

              
                #定義私鑰文件位置
              
              
private_key_path 
              
                =
              
              
                '/home/auto/.ssh/id_rsa'
              
              
                #取出私鑰
              
              
key 
              
                =
              
               paramiko
              
                .
              
              RSAKey
              
                .
              
              from_private_key_file
              
                (
              
              private_key_path
              
                )
              
              
                #實(shí)例化
              
              
ssh 
              
                =
              
               paramiko
              
                .
              
              SSHClient
              
                (
              
              
                )
              
              
                #應(yīng)對(duì)第一個(gè)遠(yuǎn)程登錄的用戶簽名(yes or no),該行代碼默認(rèn)填寫yes。
              
              
ssh
              
                .
              
              set_missing_host_key_policy
              
                (
              
              paramiko
              
                .
              
              AutoAddPolicy
              
                (
              
              
                )
              
              
                )
              
              
                #遠(yuǎn)程登錄賬號(hào)
              
              
ssh
              
                .
              
              connect
              
                (
              
              
                '192.168.1.223'
              
              
                ,
              
              
                22
              
              
                ,
              
              username
              
                =
              
              
                'root'
              
              
                ,
              
              pkey
              
                =
              
              key
              
                )
              
              
                #設(shè)置需要使用Linux命令并捕捉命令返回結(jié)果(輸入,輸出,錯(cuò)誤)
              
              
stdin
              
                ,
              
              stdout
              
                ,
              
              stderr 
              
                =
              
               ssh
              
                .
              
              exec_command
              
                (
              
              
                'df'
              
              
                )
              
              
                #打印結(jié)果
              
              
                print
              
              
                (
              
              stdout
              
                .
              
              read
              
                (
              
              
                )
              
              
                )
              
              
ssh
              
                .
              
              close
              
                (
              
              
                )
              
              
                ;
              
            
          

rsa公鑰與私鑰的區(qū)別
私鑰是自己用的,用于解密;公鑰用于加密。
rsa公鑰與私鑰工作原理
遠(yuǎn)程登錄時(shí),客戶端使用tcp協(xié)議發(fā)送連接請(qǐng)求(欲連接ssh端口),遠(yuǎn)程服務(wù)器使用公鑰隨機(jī)加密一段數(shù)據(jù)發(fā)送到客戶端,客戶端使用本地私鑰解密,解密完成后將數(shù)據(jù)發(fā)送到服務(wù)端,服務(wù)端對(duì)解密數(shù)據(jù)進(jìn)行比對(duì),若匹配成功,則公鑰與私鑰配對(duì)成功,即遠(yuǎn)程登錄成功。

SSH上傳和下載文件

參考:***cnblogs.com/wupeiqi/articles/4356675.html

            
            
          

線程與進(jìn)程簡(jiǎn)介

應(yīng)用程序、進(jìn)程、線程的關(guān)系

一個(gè)應(yīng)用程序里面可以有多個(gè)進(jìn)程,一個(gè)進(jìn)程里面可以有多個(gè)線程。
全局解釋器鎖
在程序運(yùn)行過(guò)程中,同一時(shí)間,一個(gè)進(jìn)程里面只能有一個(gè)線程通過(guò)全局解釋器鎖進(jìn)入cpu執(zhí)行。
多進(jìn)程與多線程的選擇
計(jì)算密集型程序需要消耗大量cpu資源,故選擇多進(jìn)程模式;IO密集型程序選擇多線程模式。
進(jìn)程的開(kāi)銷通常比線程昂貴,因?yàn)榫€程自動(dòng)共享內(nèi)存地址空間和文件描述符,這意味著,創(chuàng)建進(jìn)程比創(chuàng)建線程會(huì)花費(fèi)更多。
在執(zhí)行一些sleep/read/write/recv/send等會(huì)導(dǎo)致阻塞的函數(shù)時(shí),當(dāng)前線程會(huì)主動(dòng)放棄GIL,然后調(diào)用相應(yīng)的系統(tǒng)API,完成后再重新申請(qǐng)GIL.因此,GIL也并不是導(dǎo)致python的多線程完全沒(méi)用。在一些IO等待的場(chǎng)合,python的多線程還是發(fā)揮了作用,當(dāng)然如果多線程都是用于CPU密集的代碼,那多線程的執(zhí)行效率明顯會(huì)比單線程的低。

線程是共享內(nèi)存的,線程由進(jìn)程管理,所有線程共享主線程的內(nèi)存空間;進(jìn)程的內(nèi)存空間是互相獨(dú)立,沒(méi)有交集的。

簡(jiǎn)單創(chuàng)建線程示例1

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                #導(dǎo)入threading模塊下的Thread類
              
              
                from
              
               threading 
              
                import
              
               Thread

              
                #定義方法
              
              
                def
              
              
                funcOne
              
              
                (
              
              arg
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              arg
              
                )
              
              
                print
              
              
                (
              
              
                'before start thread'
              
              
                )
              
              
                #實(shí)例化Thread類形成對(duì)象,相當(dāng)于創(chuàng)建了一個(gè)線程.
              
              
                #使用target參數(shù)在定義的方法(函數(shù))與線程之間建立聯(lián)系
              
              
                #線程對(duì)象 = Thread(target=函數(shù)名,args(參數(shù))=(1(僅需一個(gè)參數(shù)故此處寫一),))
              
              
threadOne 
              
                =
              
               Thread
              
                (
              
              target
              
                =
              
              funcOne
              
                ,
              
              args
              
                =
              
              
                (
              
              
                1
              
              
                ,
              
              
                )
              
              
                )
              
              
                #1后面為什么加逗號(hào)?因?yàn)楫?dāng)遇到字典、列表、元組時(shí),其與方法、函數(shù)在調(diào)用時(shí)操作類似,故容易因?yàn)閰^(qū)分錯(cuò)誤而報(bào)錯(cuò),后面加逗號(hào),可以說(shuō)明這是一個(gè)序列,以此作為區(qū)分。
              
              
                #在運(yùn)行對(duì)象時(shí),并不一定馬上執(zhí)行,按系統(tǒng)調(diào)度規(guī)則被輪訓(xùn)到時(shí)執(zhí)行
              
              
threadOne
              
                .
              
              start
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              
                'after start thread'
              
              
                )
              
            
          

多線程開(kāi)發(fā)的方法

threading.Thread模塊

  • start
  • getName()
  • setName():更改線程名稱
  • isDaemon()
  • setDaemon()
  • join(timeout)
  • run

線程創(chuàng)建不宜過(guò)多也不宜過(guò)少,恰當(dāng)最好。線程過(guò)少時(shí),執(zhí)行效率低;線程過(guò)多時(shí)會(huì)導(dǎo)致上下文切換頻繁,造成大量資源浪費(fèi)。

多線程之方法應(yīng)用示例

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                #導(dǎo)入threading模塊下的Thread類
              
              
                from
              
               threading 
              
                import
              
               Thread

              
                import
              
               time

              
                #定義方法
              
              
                def
              
              
                funcOne
              
              
                (
              
              arg
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              arg
              
                )
              
              
                def
              
              
                funcTwo
              
              
                (
              
              arg
              
                ,
              
              v
              
                )
              
              
                :
              
              
                for
              
               item 
              
                in
              
              
                range
              
              
                (
              
              
                100
              
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              item
              
                )
              
              
        time
              
                .
              
              sleep
              
                (
              
              
                1
              
              
                )
              
              
                print
              
              
                (
              
              
                'before start thread'
              
              
                )
              
              
                #實(shí)例化Thread類形成對(duì)象,相當(dāng)于創(chuàng)建了一個(gè)線程.
              
              
                #使用target參數(shù)在定義的方法(函數(shù))與線程之間建立聯(lián)系
              
              
                #線程對(duì)象 = Thread(target=函數(shù)名,args=(參數(shù)1,))
              
              
threadOne 
              
                =
              
               Thread
              
                (
              
              target
              
                =
              
              funcOne
              
                ,
              
              args
              
                =
              
              
                (
              
              
                '參數(shù)1'
              
              
                ,
              
              
                )
              
              
                )
              
              
threadTwo 
              
                =
              
               Thread
              
                (
              
              target
              
                =
              
              funcTwo
              
                ,
              
              args
              
                =
              
              
                (
              
              
                '參數(shù)1'
              
              
                ,
              
              
                '參數(shù)2'
              
              
                )
              
              
                )
              
              
                #1后面為什么加逗號(hào)?因?yàn)楫?dāng)遇到字典、列表、元組時(shí),其與方法、函數(shù)在調(diào)用時(shí)操作類似,故容易因?yàn)閰^(qū)分錯(cuò)誤而報(bào)錯(cuò),后面加逗號(hào),可以說(shuō)明這是一個(gè)序列,以此作為區(qū)分。
              
              
                #在程序運(yùn)行時(shí),當(dāng)主線程已經(jīng)執(zhí)行結(jié)束,而子線程執(zhí)行緩慢仍未結(jié)束時(shí),主線程需要等待子線程執(zhí)行結(jié)束才終止程序運(yùn)行。
              
              
                #輸出當(dāng)前daemon狀態(tài),默認(rèn)False
              
              
                print
              
              
                (
              
              threadTwo
              
                .
              
              isDaemon
              
                (
              
              
                )
              
              
                )
              
              
                #設(shè)置daemon狀態(tài),此時(shí)不再遍歷100之內(nèi)的數(shù)字。
              
              
                #通過(guò)設(shè)置daemon狀態(tài),可以讓子線程隨主線程的執(zhí)行結(jié)束而結(jié)束,主線程不再等待子線程(threadOne和threadTwo)執(zhí)行結(jié)束。
              
              
threadOne
              
                .
              
              setDaemon
              
                (
              
              
                True
              
              
                )
              
              
threadTwo
              
                .
              
              setDaemon
              
                (
              
              
                True
              
              
                )
              
              
                #在運(yùn)行對(duì)象時(shí),并不一定馬上執(zhí)行,按系統(tǒng)調(diào)度規(guī)則被輪訓(xùn)到時(shí)執(zhí)行
              
              
threadOne
              
                .
              
              start
              
                (
              
              
                )
              
              
threadTwo
              
                .
              
              start
              
                (
              
              
                )
              
              
                #每個(gè)線程被創(chuàng)建時(shí)都擁有一個(gè)名字,使用'getName'方法輸出線程的名字如下
              
              
                print
              
              
                (
              
              threadOne
              
                .
              
              getName
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              threadTwo
              
                .
              
              getName
              
                (
              
              
                )
              
              
                )
              
              
                ##Thread-1
              
              
                print
              
              
                (
              
              
                'after start thread'
              
              
                )
              
            
          

多線程之自定義線程類示例

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                #導(dǎo)入模塊
              
              
                from
              
               threading 
              
                import
              
               Thread

              
                import
              
               time


              
                #自定義一個(gè)線程類myThreadClass繼承父類Thread
              
              
                #實(shí)質(zhì)是在原有Thread類的基礎(chǔ)上增加自己的功能形成自定義的線程類
              
              
                class
              
              
                myThreadClass
              
              
                (
              
              Thread
              
                )
              
              
                :
              
              
                #重寫run方法,因?yàn)楦割怲hread擁有run方法,此處為重寫。
              
              
                def
              
              
                run
              
              
                (
              
              self
              
                )
              
              
                :
              
              
        time
              
                .
              
              sleep
              
                (
              
              
                10
              
              
                )
              
              
                print
              
              
                (
              
              
                'run方法創(chuàng)建了一個(gè)線程,我等了10s才現(xiàn)身'
              
              
                )
              
              
                try
              
              
                :
              
              
                if
              
               self
              
                .
              
              _target
              
                :
              
              
                self
              
                .
              
              _target
              
                (
              
              
                *
              
              self
              
                .
              
              _args
              
                ,
              
              
                **
              
              self
              
                .
              
              _kwargs
              
                )
              
              
                finally
              
              
                :
              
              
                # Avoid a refcycle if the thread is running a function with
              
              
                # an argument that has a member that points to the thread.
              
              
                del
              
               self
              
                .
              
              _target
              
                ,
              
               self
              
                .
              
              _args
              
                ,
              
               self
              
                .
              
              _kwargs
        

              
                def
              
              
                funcThree
              
              
                (
              
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                'funcThree'
              
              
                )
              
              
                #執(zhí)行myThreadClass類從Thread類繼承的構(gòu)造函數(shù)
              
              
threadThree 
              
                =
              
               myThreadClass
              
                (
              
              target
              
                =
              
              funcThree
              
                )
              
              
threadThree
              
                .
              
              start
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              
                '主線程已經(jīng)執(zhí)行完畢'
              
              
                )
              
            
          

多線程之生產(chǎn)者與消費(fèi)者模型示例一

producer.py(非正常)

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                #導(dǎo)入模塊
              
              
                from
              
               threading 
              
                import
              
               Thread

              
                import
              
               time

              
                #導(dǎo)入隊(duì)列模塊的隊(duì)列類
              
              
                from
              
               queue 
              
                import
              
               Queue

              
                #定義生產(chǎn)者類,向隊(duì)列存放數(shù)據(jù)
              
              
                class
              
              
                producer
              
              
                (
              
              Thread
              
                )
              
              
                :
              
              
                #重寫父類的構(gòu)造函數(shù)__init__
              
              
                def
              
              
                __init__
              
              
                (
              
              self
              
                ,
              
              name
              
                ,
              
              queue
              
                )
              
              
                :
              
              
                #name:生產(chǎn)者的名字
              
              
                #queue:存放數(shù)據(jù)的容器
              
              
        self
              
                .
              
              __Name 
              
                =
              
               name
        self
              
                .
              
              __Queue 
              
                =
              
               queue
        
              
                #或Thread.__init__(self)
              
              
                super
              
              
                (
              
              producer
              
                ,
              
              self
              
                )
              
              
                .
              
              __init__
              
                (
              
              
                )
              
              
                #重寫父類的run函數(shù)
              
              
                def
              
              
                run
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                while
              
              
                True
              
              
                :
              
              
                #判斷隊(duì)列是否已滿
              
              
                if
              
               self
              
                .
              
              __Queue
              
                .
              
              full
              
                (
              
              
                )
              
              
                :
              
              
                #滿則等待1秒
              
              
                time
              
                .
              
              sleep
              
                (
              
              
                1
              
              
                )
              
              
                else
              
              
                :
              
              
                #未滿則向隊(duì)列加入數(shù)據(jù)
              
              
                self
              
                .
              
              __Queue
              
                .
              
              put
              
                (
              
              
                'someData'
              
              
                )
              
              
                print
              
              
                (
              
              
                '%s 向隊(duì)列中放置了一個(gè)數(shù)據(jù)'
              
              
                %
              
              
                (
              
              self
              
                .
              
              __Name
              
                ,
              
              
                )
              
              
                )
              
              
                time
              
                .
              
              sleep
              
                (
              
              
                1
              
              
                )
              
              
        Thread
              
                .
              
              run
              
                (
              
              self
              
                )
              
              
                #定義消費(fèi)者類 , 從隊(duì)列取出數(shù)據(jù)  
              
              
                class
              
              
                consumer
              
              
                (
              
              Thread
              
                )
              
              
                :
              
              
                #重寫父類的構(gòu)造函數(shù)__init__
              
              
                def
              
              
                __init__
              
              
                (
              
              self
              
                ,
              
              name
              
                ,
              
              queue
              
                )
              
              
                :
              
              
                #name:生產(chǎn)者的名字
              
              
                #queue:存放數(shù)據(jù)的容器
              
              
        self
              
                .
              
              __Name 
              
                =
              
               name
        self
              
                .
              
              __Queue 
              
                =
              
               queue
        Thread
              
                .
              
              __init__
              
                (
              
              self
              
                )
              
              
                def
              
              
                run
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                #判斷隊(duì)列是否已空
              
              
                if
              
               self
              
                .
              
              __Queue
              
                .
              
              empty
              
                (
              
              
                )
              
              
                :
              
              
                #空則等待1秒
              
              
            time
              
                .
              
              sleep
              
                (
              
              
                1
              
              
                )
              
              
                else
              
              
                :
              
              
                #未空則從隊(duì)列拿出一個(gè)數(shù)據(jù)
              
              
            self
              
                .
              
              __Queue
              
                .
              
              get
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              
                '%s 從隊(duì)列中取走了一個(gè)數(shù)據(jù)'
              
              
                %
              
              
                (
              
              self
              
                .
              
              __Name
              
                ,
              
              
                )
              
              
                )
              
              
            time
              
                .
              
              sleep
              
                (
              
              
                1
              
              
                )
              
              
        Thread
              
                .
              
              run
              
                (
              
              self
              
                )
              
              
                #創(chuàng)建隊(duì)列對(duì)象并設(shè)置隊(duì)列最大為10。
              
              
                #隊(duì)列特性:先進(jìn)先出,線程安全的
              
              
queueObj 
              
                =
              
               Queue
              
                (
              
              maxsize
              
                =
              
              
                100
              
              
                )
              
              
                #使用xxx對(duì)數(shù)據(jù)結(jié)構(gòu)(序列、列表等)上鎖,同一時(shí)間僅允許一個(gè)線程對(duì)上鎖的數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作。
              
              
                #向隊(duì)列存放數(shù)據(jù)
              
              
queueObj
              
                .
              
              put
              
                (
              
              
                '1'
              
              
                )
              
              
                #查看隊(duì)列內(nèi)容
              
              
                print
              
              
                (
              
              queueObj
              
                .
              
              queue
              
                )
              
              
                #使用queueObj.empty()判斷隊(duì)列時(shí)候?yàn)榭?
              
              
                print
              
              
                (
              
              queueObj
              
                .
              
              empty
              
                (
              
              
                )
              
              
                )
              
              
                #從隊(duì)列取出數(shù)據(jù)
              
              
                print
              
              
                (
              
              queueObj
              
                .
              
              get
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              queueObj
              
                .
              
              queue
              
                )
              
              
                print
              
              
                (
              
              queueObj
              
                .
              
              empty
              
                (
              
              
                )
              
              
                )
              
              
                #使用隊(duì)列類創(chuàng)建一個(gè)倉(cāng)庫(kù)對(duì)象queueObjTwo
              
              
queueObjTwo 
              
                =
              
               Queue
              
                (
              
              maxsize
              
                =
              
              
                100
              
              
                )
              
              
                #使用生產(chǎn)者類創(chuàng)建生產(chǎn)者對(duì)象。因?yàn)楸举|(zhì)上是繼承了線程類Thread,所以可以認(rèn)為創(chuàng)建的生產(chǎn)者對(duì)象就等同于創(chuàng)建的新的線程
              
              
                #創(chuàng)建三個(gè)生產(chǎn)者
              
              
producerOne 
              
                =
              
               producer
              
                (
              
              
                'producerYiHao'
              
              
                ,
              
              queueObjTwo
              
                )
              
              
producerOne
              
                .
              
              start
              
                (
              
              
                )
              
              
producerTwo 
              
                =
              
               producer
              
                (
              
              
                'producerErHao'
              
              
                ,
              
              queueObjTwo
              
                )
              
              
producerTwo
              
                .
              
              start
              
                (
              
              
                )
              
              
producerThree 
              
                =
              
               producer
              
                (
              
              
                'producerSanHao'
              
              
                ,
              
              queueObjTwo
              
                )
              
              
producerThree
              
                .
              
              start
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              queueObjTwo
              
                .
              
              queue
              
                )
              
              
                #使用消費(fèi)者類創(chuàng)建消費(fèi)者對(duì)象。因?yàn)楸举|(zhì)上是繼承了線程類Thread,所以可以認(rèn)為創(chuàng)建的消費(fèi)者對(duì)象就等同于創(chuàng)建的新的線程
              
              
                #創(chuàng)建二十個(gè)消費(fèi)者
              
              
                for
              
               item 
              
                in
              
              
                range
              
              
                (
              
              
                20
              
              
                )
              
              
                :
              
              
    name 
              
                =
              
              
                'consumer%d'
              
              
                %
              
              
                (
              
              item
              
                ,
              
              
                )
              
              
    name 
              
                =
              
               consumer
              
                (
              
              name
              
                ,
              
              queueObjTwo
              
                )
              
              
    name
              
                .
              
              start
              
                (
              
              
                )
              
              
    
consumerOne 
              
                =
              
               consumer
              
                (
              
              
                'consumerYiHao'
              
              
                ,
              
              queueObjTwo
              
                )
              
              
consumerOne
              
                .
              
              start
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              queueObjTwo
              
                .
              
              queue
              
                )
              
            
          

消費(fèi)者生產(chǎn)者模型優(yōu)點(diǎn)
解耦:令一個(gè)程序的各個(gè)部分之間關(guān)聯(lián)性降到最低。

函數(shù)式編程實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者模型

producerDemoTwo.py

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                import
              
               threading

              
                import
              
               time

              
                import
              
               queue

              
                import
              
               random


              
                def
              
              
                producer
              
              
                (
              
              name
              
                ,
              
              que
              
                )
              
              
                :
              
              
                while
              
              
                True
              
              
                :
              
              
                if
              
               que
              
                .
              
              qsize
              
                (
              
              
                )
              
              
                <
              
              
                3
              
              
                :
              
              
            que
              
                .
              
              put
              
                (
              
              
                'baozi'
              
              
                )
              
              
                print
              
              
                (
              
              
                '%s make a baozi...'
              
              
                %
              
              name
              
                )
              
              
                else
              
              
                :
              
              
                print
              
              
                (
              
              
                '有三個(gè)包子,吃了在做'
              
              
                )
              
              
                #隨機(jī)等待一到五秒
              
              
        time
              
                .
              
              sleep
              
                (
              
              random
              
                .
              
              randrange
              
                (
              
              
                5
              
              
                )
              
              
                )
              
              
                def
              
              
                consumer
              
              
                (
              
              name
              
                ,
              
              que
              
                )
              
              
                :
              
              
                while
              
              
                True
              
              
                :
              
              
                #使用try捕捉錯(cuò)誤異常,若隊(duì)列為空,則打印異常輸出,此時(shí)consumer線程不再中斷。沒(méi)有捕捉錯(cuò)誤異常且隊(duì)列為空時(shí),consumer線程拋出異常并中斷
              
              
                try
              
              
                :
              
              
                #使用'que.get()'時(shí),若隊(duì)列中無(wú)數(shù)據(jù),則阻塞;使用'que.get_nowait()'時(shí),若隊(duì)列中無(wú)數(shù)據(jù),則拋出異常
              
              
            que
              
                .
              
              get_nowait
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              
                '%s eat a baozi'
              
              
                %
              
              name
              
                )
              
              
                #隨機(jī)等待一到三秒
              
              
                except
              
               Exception
              
                :
              
              
                print
              
              
                (
              
              u
              
                'baozi 吃光了'
              
              
                )
              
              
        time
              
                .
              
              sleep
              
                (
              
              random
              
                .
              
              randrange
              
                (
              
              
                5
              
              
                )
              
              
                )
              
              
        

q 
              
                =
              
              queue
              
                .
              
              Queue
              
                (
              
              
                )
              
              
p1 
              
                =
              
               threading
              
                .
              
              Thread
              
                (
              
              target
              
                =
              
              producer
              
                ,
              
              args
              
                =
              
              
                [
              
              
                'chef1'
              
              
                ,
              
              q
              
                ]
              
              
                )
              
              
p2 
              
                =
              
               threading
              
                .
              
              Thread
              
                (
              
              target
              
                =
              
              producer
              
                ,
              
              args
              
                =
              
              
                [
              
              
                'chef2'
              
              
                ,
              
              q
              
                ]
              
              
                )
              
              
p1
              
                .
              
              start
              
                (
              
              
                )
              
              
p2
              
                .
              
              start
              
                (
              
              
                )
              
              
c1 
              
                =
              
               threading
              
                .
              
              Thread
              
                (
              
              target
              
                =
              
              consumer
              
                ,
              
              args
              
                =
              
              
                [
              
              
                'consu1'
              
              
                ,
              
              q
              
                ]
              
              
                )
              
              
c2 
              
                =
              
               threading
              
                .
              
              Thread
              
                (
              
              target
              
                =
              
              consumer
              
                ,
              
              args
              
                =
              
              
                [
              
              
                'consu2'
              
              
                ,
              
              q
              
                ]
              
              
                )
              
              
c1
              
                .
              
              start
              
                (
              
              
                )
              
              
c2
              
                .
              
              start
              
                (
              
              
                )
              
            
          

多線程開(kāi)發(fā)之線程鎖

線程鎖中的threading.Lock和threading.Rlock

線程安全:
因?yàn)槎鄠€(gè)線程之間共享一份內(nèi)存數(shù)據(jù),為了防止出現(xiàn)多個(gè)線程同時(shí)修改一份內(nèi)存數(shù)據(jù)的情況,需要使用線程鎖。
定義遞歸鎖對(duì)象,可以在鎖內(nèi)繼續(xù)加鎖而不會(huì)出現(xiàn)阻塞現(xiàn)象。
lock = threading.RLock()
定義線程鎖對(duì)象,同時(shí)允許有四個(gè)線程對(duì)同一份數(shù)據(jù)進(jìn)行操作。
lock = threading.BoundedSemaphore(4)

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                import
              
               threading

              
                import
              
               time

              
                #定義全局變量num,多線程同時(shí)啟動(dòng)時(shí),共享內(nèi)存數(shù)據(jù)全局變量num
              
              
num 
              
                =
              
              
                0
              
              
                #定義函數(shù)
              
              
                def
              
              
                run
              
              
                (
              
              n
              
                )
              
              
                :
              
              
                #聲明變量num為全局變量
              
              
    time
              
                .
              
              sleep
              
                (
              
              
                1
              
              
                )
              
              
                global
              
               num
    
              
                #獲取鎖,當(dāng)前線程獨(dú)占對(duì)該數(shù)據(jù)的操作
              
              
                #鎖的位置應(yīng)當(dāng)僅放置于對(duì)數(shù)據(jù)操作的代碼段外面。該代碼段將變成串行線程。
              
              
    lock
              
                .
              
              acquire
              
                (
              
              
                )
              
              
    num 
              
                +=
              
              
                1
              
              
                print
              
              
                (
              
              num
              
                )
              
              
    lock
              
                .
              
              release
              
                (
              
              
                )
              
              
                #run('dd')
              
              
                #定義線程鎖對(duì)象
              
              
lock 
              
                =
              
               threading
              
                .
              
              Lock
              
                (
              
              
                )
              
              
                #定義遞歸鎖對(duì)象,可以在鎖內(nèi)繼續(xù)加鎖而不會(huì)出現(xiàn)阻塞現(xiàn)象。
              
              
                #lock = threading.RLock()
              
              
                #定義線程鎖對(duì)象,同時(shí)允許有四個(gè)線程對(duì)同一份數(shù)據(jù)進(jìn)行操作。
              
              
                #lock = threading.BoundedSemaphore(4)
              
              
                #生成十個(gè)線程
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                100
              
              
                )
              
              
                :
              
              
    t 
              
                =
              
               threading
              
                .
              
              Thread
              
                (
              
              target
              
                =
              
              run
              
                ,
              
              args
              
                =
              
              
                (
              
              i
              
                ,
              
              
                )
              
              
                )
              
              
    t
              
                .
              
              start
              
                (
              
              
                )
              
              
                #此時(shí)由于多個(gè)線程同時(shí)執(zhí)行函數(shù)run修改全局變量num,num的值容易出現(xiàn)異常。
              
              
                #鎖內(nèi)加鎖,程序會(huì)出現(xiàn)阻塞(死鎖)現(xiàn)象。出現(xiàn)該問(wèn)題時(shí),使用'lock = threading.RLock()'遞歸鎖可以解決.
              
            
          

多線程開(kāi)發(fā)之event事件

            
              
                #!/usr/bin/env python
              
              
                #coding:utf-8
              
              
                import
              
               threading

              
                import
              
               time

              
                #實(shí)現(xiàn)兩個(gè)線程之間通過(guò)event事件來(lái)進(jìn)行交互。
              
              
                #定義生產(chǎn)者
              
              
                def
              
              
                producer
              
              
                (
              
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              u
              
                '等人來(lái)買包子'
              
              
                )
              
              
                #等待事件,阻塞狀態(tài)
              
              
    event
              
                .
              
              wait
              
                (
              
              
                )
              
              
                #使用'isSet'判斷事件狀態(tài)(是否為true).此時(shí)不存在阻塞狀態(tài)
              
              
                #print(event.isSet())
              
              
                #清空事件時(shí)間狀態(tài)
              
              
    event
              
                .
              
              clear
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                '剛剛有個(gè)摳腳大漢來(lái)買包子了'
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                'dang dang dang ,開(kāi)工做包子啦'
              
              
                )
              
              
                #三秒過(guò)后
              
              
    time
              
                .
              
              sleep
              
                (
              
              
                10
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                '啦啦啦,包子出鍋啦'
              
              
                )
              
              
    
    event
              
                .
              
              
                set
              
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                '歪,妖妖靈嗎,包子好了,趁熱買吧'
              
              
                )
              
              
                #定義消費(fèi)者
              
              
                def
              
              
                consumer
              
              
                (
              
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              u
              
                '俺去買包子'
              
              
                )
              
              
                #設(shè)置標(biāo)志,觸發(fā)事件
              
              
    event
              
                .
              
              
                set
              
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                '(顧客)俺剛剛跟廚師說(shuō)做倆包子,俺要買'
              
              
                )
              
              
    time
              
                .
              
              sleep
              
                (
              
              
                3
              
              
                )
              
              
                while
              
              
                True
              
              
                :
              
              
                if
              
               event
              
                .
              
              isSet
              
                (
              
              
                )
              
              
                :
              
              
                print
              
              
                (
              
              
                '看表:時(shí)間到了'
              
              
                )
              
              
                break
              
              
                else
              
              
                :
              
              
                print
              
              
                (
              
              
                '等待中,肚子咕咕叫'
              
              
                )
              
              
            time
              
                .
              
              sleep
              
                (
              
              
                1
              
              
                )
              
              
    
    event
              
                .
              
              wait
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              u
              
                '俺收到通知,:您的包子出鍋啦,趕緊趁熱去買吧'
              
              
                )
              
              
                #定義事件觸發(fā),消費(fèi)者觸發(fā)事件去生產(chǎn)者那邊買包子
              
              
event 
              
                =
              
               threading
              
                .
              
              Event
              
                (
              
              
                )
              
              
p1 
              
                =
              
               threading
              
                .
              
              Thread
              
                (
              
              target
              
                =
              
              producer
              
                )
              
              
p2 
              
                =
              
               threading
              
                .
              
              Thread
              
                (
              
              target
              
                =
              
              consumer
              
                )
              
              
p1
              
                .
              
              start
              
                (
              
              
                )
              
              
p2
              
                .
              
              start
              
                (
              
              
                )
              
            
          

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产欧美视频综合二区 | a毛片免费在线观看 | 国产精品麻豆99久久 | 国产九九在线 | 99精品视频看国产啪视频 | 免费人成在线观看网站品爱网 | 亚洲欧美日韩中文字幕在线一区 | 亚洲五月综合网色九月色 | 国产精品天天影视久久综合网 | 手机看片福利日韩国产 | 国产中文字幕亚洲 | 五月天婷婷在线观看高清 | 夜色伊人 | 日日摸夜夜嗷嗷叫日日拍 | 国产成人毛片亚洲精品不卡 | 欧美日韩色 | 中文字幕在线看日本大片 | 在线观看日本一区 | 苦瓜se影院在线视频网站 | 久久中文字幕久久久久 | 国产精品久久久久久久久齐齐 | 性感美女香蕉视频 | 久久综合九色综合97_ 久久久 | 久久99国产亚洲高清 | 久操视频在线免费观看 | 亚洲日本在线播放 | 欧美乱插 | 久久亚洲国产的中文 | 韩国日本美国免费毛片 | 国产精品你懂的 | 国产精品久久久久久久9999 | 久久福利在线 | 国产日韩三级 | 天天爱天天干天天 | 免费福利入口在线观看 | 成人欧美一区二区三区黑人妖 | 日日干夜夜草 | 香蕉免费一级视频在线观看 | 国产一级片毛片 | 伊人情人综合成人久久网小说 | 久久精品国产精品亚洲人人 |