Python程序設(shè)計(jì)課件第12章網(wǎng)絡(luò)編程和多線程編程_第1頁
Python程序設(shè)計(jì)課件第12章網(wǎng)絡(luò)編程和多線程編程_第2頁
Python程序設(shè)計(jì)課件第12章網(wǎng)絡(luò)編程和多線程編程_第3頁
Python程序設(shè)計(jì)課件第12章網(wǎng)絡(luò)編程和多線程編程_第4頁
Python程序設(shè)計(jì)課件第12章網(wǎng)絡(luò)編程和多線程編程_第5頁
已閱讀5頁,還剩42頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、網(wǎng)絡(luò)編程基礎(chǔ)TCP編程多線程編程第12章 網(wǎng)絡(luò)和多任務(wù)編程參考書目Python 程序設(shè)計(jì)網(wǎng)絡(luò)編程基礎(chǔ)第12章 網(wǎng)絡(luò)和多任務(wù)編程參考書目Python目錄網(wǎng)絡(luò)編程基礎(chǔ)TCP編程多線程編程這里說明圖片內(nèi)容 目錄網(wǎng)絡(luò)編程基礎(chǔ)這里說明圖片內(nèi)容 網(wǎng)絡(luò)編程基礎(chǔ)TCP編程多線程編程目錄這里說明圖片內(nèi)容 網(wǎng)絡(luò)編程基礎(chǔ)目錄這里說明圖片內(nèi)容 網(wǎng)絡(luò)編程基礎(chǔ)1 IP 地址IP 地址就是標(biāo)識(shí)網(wǎng)絡(luò)中設(shè)備的一個(gè)地址,類比家庭地址。IP 地址分為兩類: IPv4 和 IPv6。目前使用的IP地址由點(diǎn)分十進(jìn)制組成(比如:) IPv4未來使用的IP地址由冒號(hào)十六進(jìn)制組成fe80:c0be:39:4cb4:3d21%30) IPv6

2、網(wǎng)絡(luò)編程基礎(chǔ)1 IP 地址IP 地址就是標(biāo)識(shí)網(wǎng)絡(luò)中設(shè)備的一個(gè)網(wǎng)絡(luò)編程基礎(chǔ)1 IP 地址IP 地址的作用是標(biāo)識(shí)網(wǎng)絡(luò)中唯一的一臺(tái)設(shè)備的,也就是說通過IP地址能夠找到網(wǎng)絡(luò)中某臺(tái)設(shè)備。查看 IP 地址方式:使用 ifconfig 命令Linux 和 mac OS使用 ipconfig 命令Windows檢查網(wǎng)絡(luò)是否正常使用,通常是在命令提示符中下使用ping 命令。比如:ping 21或者ping 。網(wǎng)絡(luò)編程基礎(chǔ)1 IP 地址IP 地址的作用是標(biāo)識(shí)網(wǎng)絡(luò)中唯一的文件相關(guān)的基本概念2端口與端口號(hào)傳輸數(shù)據(jù)的通道,好比教室的門作用就是給運(yùn)行的應(yīng)用程序提供傳輸數(shù)據(jù)的通道。端口對(duì)端口進(jìn)行了編號(hào),好比現(xiàn)實(shí)生活中的門

3、牌號(hào)作用是用來區(qū)分和管理不同端口的,通過端口號(hào)能找到唯一個(gè)的一個(gè)端口。端口號(hào)端口和端口號(hào)的關(guān)系:端口號(hào)可以標(biāo)識(shí)唯一的一個(gè)端口。文件相關(guān)的基本概念2端口與端口號(hào)傳輸數(shù)據(jù)的通道,好比教室的門文件相關(guān)的基本概念2端口與端口號(hào)指眾所周知的端口號(hào),范圍從0到1023一般固定分配給一些服務(wù),比如21端口分配給FTP(文件傳輸協(xié)議)服務(wù)知名端口號(hào)一般程序員開發(fā)應(yīng)用程序使用端口號(hào)稱為動(dòng)態(tài)端口號(hào), 范圍是從1024到65535。如果程序沒有設(shè)置端口號(hào),操作系統(tǒng)會(huì)在范圍內(nèi)隨機(jī)生成。當(dāng)運(yùn)行的程序退出時(shí),所占用的這個(gè)端口號(hào)就會(huì)被釋放。動(dòng)態(tài)端口號(hào)端口號(hào)的分類:文件相關(guān)的基本概念2端口與端口號(hào)指眾所周知的端口號(hào),范圍從0

4、文件相關(guān)的基本概念3 TCP數(shù)據(jù)不能隨便發(fā)送,在發(fā)送之前還需要選擇一個(gè)對(duì)應(yīng)的傳輸協(xié)議,保證程序之間按照指定的傳輸規(guī)則進(jìn)行數(shù)據(jù)的通信,即TCP。TCP 的英文全拼(Transmission Control Protocol)簡稱傳輸控制協(xié)議,它是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。比如: 文件下載,瀏覽器上網(wǎng)。TCP通信步驟:1)創(chuàng)建連接2)傳輸數(shù)據(jù)3)關(guān)閉連接TCP 的特點(diǎn):1)面向連接2)可靠傳輸文件相關(guān)的基本概念3 TCP數(shù)據(jù)不能隨便發(fā)送,在發(fā)送之前還需文件相關(guān)的基本概念4 Socket(套接字)socket (簡稱 套接字) 是進(jìn)程之間通信一個(gè)工具,好比現(xiàn)實(shí)生活中的插座s

5、ocket 的作用是負(fù)責(zé)進(jìn)程之間的網(wǎng)絡(luò)數(shù)據(jù)傳輸,好比數(shù)據(jù)的搬運(yùn)工。socket 使用場景:只要跟網(wǎng)絡(luò)相關(guān)的應(yīng)用程序或者軟件都使用到了socket。比如即時(shí)聊天工具:QQ、微信和瀏覽器。文件相關(guān)的基本概念4 Socket(套接字)文件相關(guān)的基本概念4 Socket(套接字)send和recv分別是指利用Socket在客戶端與服務(wù)器端的數(shù)據(jù)發(fā)送和接收,send和recv的底層工作原理:1. TCP socket的發(fā)送和接收緩沖區(qū)2. send原理剖析應(yīng)用程序把發(fā)送的數(shù)據(jù)先寫入到發(fā)送緩沖區(qū)(內(nèi)存中的一片空間),再由操作系統(tǒng)控制網(wǎng)卡把發(fā)送緩沖區(qū)的數(shù)據(jù)發(fā)送給服務(wù)端網(wǎng)卡3. recv原理剖析調(diào)用操作系統(tǒng)接

6、口,由操作系統(tǒng)通過網(wǎng)卡接收數(shù)據(jù),把接收的數(shù)據(jù)寫入到接收緩沖區(qū)(內(nèi)存中的一片空間),應(yīng)用程序再從接收緩存區(qū)獲取客戶端發(fā)送的數(shù)據(jù)。文件相關(guān)的基本概念4 Socket(套接字)send和rec網(wǎng)絡(luò)編程基礎(chǔ)TCP編程多線程編程目錄這里說明圖片內(nèi)容 網(wǎng)絡(luò)編程基礎(chǔ)目錄這里說明圖片內(nèi)容 TCP編程Socket分為客戶端和服務(wù)器??蛻舳薙ocket用于建立與服務(wù)端Socket的連接,服務(wù)端Socket用于等待客戶端Socket的連接。因此,在使用客戶端Socket之前,必須建立服務(wù)端Socket。在Python語言中創(chuàng)建Socket服務(wù)端程序,需要使用Socket模塊中的socket類。TCP編程Socket

7、分為客戶端和服務(wù)器??蛻舳薙ocketTCP編程TCP網(wǎng)絡(luò)應(yīng)用程序的注意以下2點(diǎn):1)進(jìn)行通信的時(shí)候必須要先建立連接。TCP客戶端程序一般不需要綁定端口號(hào),因?yàn)榭蛻舳耸侵鲃?dòng)發(fā)起建立連接的。TCP 服務(wù)端程序必須綁定端口號(hào),否則客戶端找不到這個(gè) TCP 服務(wù)端程序。listen后的套接字是被動(dòng)套接字,只負(fù)責(zé)接收新的客戶端的連接請(qǐng)求,不能收發(fā)消息。2)連接成功后, TCP 服務(wù)器端程序會(huì)產(chǎn)生一個(gè)新的套接字,收發(fā)客戶端消息使用該套接字。關(guān)閉 accept 返回的套接字意味著和這個(gè)客戶端已經(jīng)通信完畢。關(guān)閉 listen 后的套接字意味著服務(wù)端的套接字關(guān)閉了,會(huì)導(dǎo)致新的客戶端不能連接服務(wù)端,但是之前已經(jīng)

8、接成功的客戶端還能正常通信。TCP編程TCP網(wǎng)絡(luò)應(yīng)用程序的注意以下2點(diǎn):TCP編程1 TCP通信流程TCP編程1 TCP通信流程TCP編程2 創(chuàng)建TCP客戶端程序主動(dòng)發(fā)起建立連接請(qǐng)求的是客戶端程序。編寫TCP客戶端程序:首先要導(dǎo)入socket模塊:import socket其次是創(chuàng)建客戶端 socket 對(duì)象:socket.socket(AddressFamily, Type)AddressFamily 表示IP地址類型, 分為IPv4和IPv6Type 表示傳輸協(xié)議類型TCP編程2 創(chuàng)建TCP客戶端程序主動(dòng)發(fā)起建立連接請(qǐng)求的是客TCP編程2 創(chuàng)建TCP客戶端程序客戶端創(chuàng)建方法:1.conne

9、ct(host, port) 表示和服務(wù)端套接字建立連接host是服務(wù)器ip地址port是應(yīng)用程序的端口號(hào)2.send(data) 表示發(fā)送數(shù)據(jù),data是二進(jìn)制數(shù)據(jù)3.recv(buffersize) 表示接收數(shù)據(jù), buffersize是每次接收數(shù)據(jù)的長度TCP編程2 創(chuàng)建TCP客戶端程序客戶端創(chuàng)建方法:1.conTCP編程2 創(chuàng)建TCP客戶端程序本例實(shí)現(xiàn)了一個(gè)客戶端Socket應(yīng)用,該應(yīng)用發(fā)送字符串,然后服務(wù)端返回?cái)?shù)據(jù),最后將這些數(shù)據(jù)輸出到網(wǎng)絡(luò)調(diào)試的終端上。import socketif _name_ = _main_: # 創(chuàng)建tcp客戶端套接字 # 1. AF_INET:表示ipv4

10、 # 2. SOCK_STREAM: tcp傳輸協(xié)議 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 和服務(wù)端應(yīng)用程序建立連接 tcp_client_socket.connect(2, 8080) # 代碼執(zhí)行到此,說明連接建立成功 # 準(zhǔn)備發(fā)送的數(shù)據(jù) send_data = 服務(wù)端,我是愛你的,請(qǐng)接受我吧!.encode(gbk) TCP編程2 創(chuàng)建TCP客戶端程序本例實(shí)現(xiàn)了一個(gè)客戶端SocTCP編程2 創(chuàng)建TCP客戶端程序本例實(shí)現(xiàn)了一個(gè)客戶端Socket應(yīng)用,該應(yīng)用發(fā)送字符串,然后服務(wù)端返回?cái)?shù)據(jù)

11、,最后將這些數(shù)據(jù)輸出到網(wǎng)絡(luò)調(diào)試的終端上。 # 發(fā)送數(shù)據(jù) tcp_client_socket.send(send_data) # 接收數(shù)據(jù), 這次接收的數(shù)據(jù)最大字節(jié)數(shù)是1024 recv_data = tcp_client_socket.recv(1024) # 返回的直接是服務(wù)端程序發(fā)送的二進(jìn)制數(shù)據(jù) print(recv_data) # 對(duì)數(shù)據(jù)進(jìn)行解碼 recv_content = recv_data.decode(gbk) print(接收服務(wù)端的數(shù)據(jù)為:, recv_content) # 關(guān)閉套接字 tcp_client_socket.close()運(yùn)行結(jié)果:bxb0 xaexc4xe3x

12、d4xdaxbfxdaxa3xacxd7xecxc4xd1xbfxaaxa3xa1接收服務(wù)端的數(shù)據(jù)為: 愛你在口,嘴難開!TCP編程2 創(chuàng)建TCP客戶端程序本例實(shí)現(xiàn)了一個(gè)客戶端SocTCP編程3 創(chuàng)建TCP服務(wù)器端程序等待接受連接請(qǐng)求的是服務(wù)端程序。編寫TCP服務(wù)端程序:首先要導(dǎo)入socket模塊:import socket其次是創(chuàng)建服務(wù)端 socket 對(duì)象:socket.socket(AddressFamily, Type)AddressFamily 表示IP地址類型, 分為IPv4和IPv6Type 表示傳輸協(xié)議類型TCP編程3 創(chuàng)建TCP服務(wù)器端程序等待接受連接請(qǐng)求的是服務(wù)TCP編程3

13、 創(chuàng)建TCP服務(wù)器端程序服務(wù)端創(chuàng)建過程:1.bind(host, port) 表示綁定端口號(hào), host 是 ip 地址,port 是端口號(hào),ip 地址一般不指定,表示本機(jī)的任何一個(gè)ip地址都可以。2.listen (backlog) 表示設(shè)置監(jiān)聽,backlog參數(shù)表示最大等待建立連接的個(gè)數(shù)。3.accept() 表示等待接受客戶端的連接請(qǐng)求4.send(data) 表示發(fā)送數(shù)據(jù),data 是二進(jìn)制數(shù)據(jù)5.recv(buffersize) 表示接收數(shù)據(jù), buffersize 是每次接收數(shù)據(jù)的長度TCP編程3 創(chuàng)建TCP服務(wù)器端程序服務(wù)端創(chuàng)建過程:1.biTCP編程3 創(chuàng)建TCP服務(wù)器端程序

14、創(chuàng)建TCP服務(wù)端套接字,設(shè)置端口號(hào)為8989,設(shè)置監(jiān)聽,準(zhǔn)備接受客戶端發(fā)來的數(shù)據(jù),并顯示客戶端的IP和端口號(hào),演示TCP 服務(wù)端程序。import socketif _name_ = _main_: # 創(chuàng)建TCP服務(wù)器端套接字 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 設(shè)置端口號(hào)復(fù)用,讓程序退出端口號(hào)立即釋放 tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # 給程序綁定端口號(hào) tcp_se

15、rver_socket.bind(, 8989) # 設(shè)置監(jiān)聽 # 128:最大等待建立連接的個(gè)數(shù), 提示: 目前是單任務(wù)的服務(wù)端,同一時(shí)刻只能服務(wù)于一個(gè)客戶端,后續(xù)使用多任務(wù)能夠讓服務(wù)端同時(shí)服務(wù)于多個(gè)客戶端, # 不需要讓客戶端等待建立連接 tcp_server_socket.listen(128)TCP編程3 創(chuàng)建TCP服務(wù)器端程序創(chuàng)建TCP服務(wù)端套接字,TCP編程3 創(chuàng)建TCP服務(wù)器端程序創(chuàng)建TCP服務(wù)端套接字,設(shè)置端口號(hào)為8989,設(shè)置監(jiān)聽,準(zhǔn)備接受客戶端發(fā)來的數(shù)據(jù),并顯示客戶端的IP和端口號(hào),演示TCP 服務(wù)端程序。 # 等待客戶端建立連接的請(qǐng)求, 只有客戶端和服務(wù)端建立連接成功代碼

16、才會(huì)解阻塞,代碼才能繼續(xù)往下執(zhí)行 # 1. 專門和客戶端通信的套接字: service_client_socket # 2. 客戶端的ip地址和端口號(hào): ip_port service_client_socket, ip_port = tcp_server_socket.accept() # 代碼執(zhí)行到此說明連接建立成功 print(客戶端的ip地址和端口號(hào):, ip_port) # 接收客戶端發(fā)送的數(shù)據(jù), 這次接收數(shù)據(jù)的最大字節(jié)數(shù)是1024 recv_data = service_client_socket.recv(1024) # 獲取數(shù)據(jù)的長度 recv_data_length = le

17、n(recv_data) print(接收數(shù)據(jù)的長度為:, recv_data_length) # 對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行解碼 recv_content = recv_data.decode(gbk) print(接收客戶端的數(shù)據(jù)為:, recv_content)TCP編程3 創(chuàng)建TCP服務(wù)器端程序創(chuàng)建TCP服務(wù)端套接字,TCP編程3 創(chuàng)建TCP服務(wù)器端程序創(chuàng)建TCP服務(wù)端套接字,設(shè)置端口號(hào)為8989,設(shè)置監(jiān)聽,準(zhǔn)備接受客戶端發(fā)來的數(shù)據(jù),并顯示客戶端的IP和端口號(hào),演示TCP 服務(wù)端程序。# 準(zhǔn)備發(fā)送的數(shù)據(jù) send_data = ok, 問題正在處理中.encode(gbk) # 發(fā)送數(shù)據(jù)給客戶端

18、 service_client_socket.send(send_data) # 關(guān)閉服務(wù)與客戶端的套接字, 終止和客戶端通信的服務(wù) service_client_socket.close() # 關(guān)閉服務(wù)端的套接字, 終止和客戶端提供建立連接請(qǐng)求的服務(wù) tcp_server_socket.close()運(yùn)行結(jié)果:客戶端的ip地址和端口號(hào): (02, 53524)接收數(shù)據(jù)的長度為: 18接收客戶端的數(shù)據(jù)為: 愛你在口,口難開!TCP編程3 創(chuàng)建TCP服務(wù)器端程序創(chuàng)建TCP服務(wù)端套接字,網(wǎng)絡(luò)編程基礎(chǔ)TCP編程多線程編程目錄這里說明圖片內(nèi)容 網(wǎng)絡(luò)編程基礎(chǔ)目錄這里說明圖片內(nèi)容 多線程編程多任務(wù)是指在

19、同一時(shí)間內(nèi)執(zhí)行多個(gè)任務(wù),例如: 現(xiàn)在電腦安裝的操作系統(tǒng)都是多任務(wù)操作系統(tǒng),可以同時(shí)運(yùn)行著多個(gè)軟件。有2種執(zhí)行方式:在一段時(shí)間內(nèi)交替去執(zhí)行任務(wù)。例如:對(duì)于單核CPU處理多任務(wù),操作系統(tǒng)輪流讓各個(gè)軟件交替執(zhí)行,假如:軟件1執(zhí)行0.01秒,切換到軟件2,軟件2執(zhí)行并發(fā)對(duì)于多核CPU處理多任務(wù),操作系統(tǒng)會(huì)給CPU的每個(gè)內(nèi)核安排一個(gè)執(zhí)行的軟件,多個(gè)內(nèi)核分別運(yùn)行不同的程序。并行在Python程序中,想要實(shí)現(xiàn)多任務(wù)可以使用進(jìn)程來完成,進(jìn)程是實(shí)現(xiàn)多任務(wù)的一種方式。多線程編程多任務(wù)是指在同一時(shí)間內(nèi)執(zhí)行多個(gè)任務(wù),例如: 現(xiàn)在電多線程編程1 進(jìn)程與多進(jìn)程的使用1.什么是進(jìn)程?一個(gè)正在運(yùn)行的程序或者軟件就是一個(gè)進(jìn)程2

20、.多進(jìn)程的使用Python的多進(jìn)程包multiprocessing可以完成從單進(jìn)程到并發(fā)執(zhí)行的轉(zhuǎn)換,支持子進(jìn)程、通信和共享數(shù)據(jù)、執(zhí)行不同形式的同步,提供了Process、Lock等組件。Process類,該類可用來在Windows平臺(tái)上創(chuàng)建新進(jìn)程。使用Process類創(chuàng)建多進(jìn)程也有以下2種方式:1.直接創(chuàng)建Process類的實(shí)例對(duì)象,由此就可以創(chuàng)建一個(gè)新的進(jìn)程;2.通過繼承Process類的子類,創(chuàng)建實(shí)例對(duì)象,也可以創(chuàng)建新的進(jìn)程。注意,繼承Process類的子類需重寫父類的run()方法。多線程編程1 進(jìn)程與多進(jìn)程的使用1.什么是進(jìn)程?多線程編程1 進(jìn)程與多進(jìn)程的使用Process類創(chuàng)建進(jìn)程(

21、1)導(dǎo)入進(jìn)程包(2)Process進(jìn)程類的說明使用 Process 類創(chuàng)建實(shí)例化對(duì)象,其本質(zhì)是調(diào)用該類的構(gòu)造方法創(chuàng)建新進(jìn)程。import multiprocessing多線程編程1 進(jìn)程與多進(jìn)程的使用Process類創(chuàng)建進(jìn)程im多線程編程1 進(jìn)程與多進(jìn)程的使用Process 類的構(gòu)造方法格式如下:Process(group , target , name , args , kwargs)group:指定進(jìn)程組target:執(zhí)行的目標(biāo)任務(wù)名,為新建進(jìn)程指定執(zhí)行任務(wù),也就是指定一個(gè)函數(shù)name:為新建進(jìn)程設(shè)置名稱args:以元組方式給執(zhí)行任務(wù)傳參kwargs:以字典方式給執(zhí)行任務(wù)傳參多線程編程1

22、進(jìn)程與多進(jìn)程的使用Process 類的構(gòu)造方法多線程編程1 進(jìn)程與多進(jìn)程的使用2)Python Process類常用屬性和方法多線程編程1 進(jìn)程與多進(jìn)程的使用2)Python Proce多線程編程1 進(jìn)程與多進(jìn)程的使用3.獲取進(jìn)程編號(hào)獲取進(jìn)程編號(hào)的目的是驗(yàn)證主進(jìn)程和子進(jìn)程的關(guān)系,可以得知子進(jìn)程是由那個(gè)主進(jìn)程創(chuàng)建出來的。Process(group , target , name , args , kwargs)group:指定進(jìn)程組target:執(zhí)行的目標(biāo)任務(wù)名,為新建進(jìn)程指定執(zhí)行任務(wù),也就是指定一個(gè)函數(shù)name:為新建進(jìn)程設(shè)置名稱args:以元組方式給執(zhí)行任務(wù)傳參kwargs:以字典方式給執(zhí)行

23、任務(wù)傳參多線程編程1 進(jìn)程與多進(jìn)程的使用3.獲取進(jìn)程編號(hào)Proces多線程編程1 進(jìn)程與多進(jìn)程的使用【例】多進(jìn)程完成多任務(wù)的示例。# 1. 導(dǎo)入進(jìn)程包import multiprocessingimport time# 跳舞任務(wù)def dance(): for i in range(3): print(跳舞中.) time.sleep(0.2)# 唱歌任務(wù)def sing(): for i in range(3): print(唱歌中.) time.sleep(0.2)# 2. 創(chuàng)建子進(jìn)程(自己手動(dòng)創(chuàng)建的進(jìn)程稱為子進(jìn)程, 在_init_.py文件中已經(jīng)導(dǎo)入的Process類)# group:

24、進(jìn)程組,目前只能使用None,一般不需要設(shè)置# target: 進(jìn)程執(zhí)行的目標(biāo)任務(wù)# name: 進(jìn)程名,如果不設(shè)置,默認(rèn)是Process-1, .if _name_ = _main_:multiprocessing.freeze_support()dance_process = multiprocessing.Process(target=dance)sing_process = multiprocessing.Process(target=sing)# 3. 啟動(dòng)進(jìn)程執(zhí)行對(duì)應(yīng)的任務(wù)dance_process.start()sing_process.start()該例子中,進(jìn)程執(zhí)行是無序的,

25、具體哪個(gè)進(jìn)程先執(zhí)行是由操作系統(tǒng)調(diào)度決定。多線程編程1 進(jìn)程與多進(jìn)程的使用【例】多進(jìn)程完成多任務(wù)的示例多線程編程1 進(jìn)程與多進(jìn)程的使用3.獲取進(jìn)程編號(hào)獲取進(jìn)程編號(hào)的目的是驗(yàn)證主進(jìn)程和子進(jìn)程的關(guān)系,可以得知子進(jìn)程是由那個(gè)主進(jìn)程創(chuàng)建出來的。獲取進(jìn)程編號(hào)的兩種操作:獲取當(dāng)前進(jìn)程編號(hào)和獲取當(dāng)前父進(jìn)程編號(hào)。獲取當(dāng)前進(jìn)程編號(hào)函數(shù):os.getpid() def dance(): # 獲取當(dāng)前進(jìn)程的編號(hào) print(dance:, os.getpid() # 獲取當(dāng)前進(jìn)程 print(dance:, multiprocessing.current_process() for i in range(5): pr

26、int(跳舞中.) time.sleep(0.2) # 擴(kuò)展:根據(jù)進(jìn)程編號(hào)殺死指定進(jìn)程 os.kill(os.getpid(), 9)多線程編程1 進(jìn)程與多進(jìn)程的使用3.獲取進(jìn)程編號(hào)獲取當(dāng)前進(jìn)程多線程編程1 進(jìn)程與多進(jìn)程的使用4.進(jìn)程執(zhí)行帶有參數(shù)的任務(wù)Process類執(zhí)行任務(wù)并給任務(wù)傳參數(shù)有兩種方式:(1)args 表示以元組的方式給執(zhí)行任務(wù)傳參(2)kwargs 表示以字典方式給執(zhí)行任務(wù)傳參 # args: 以元組的方式給任務(wù)傳入?yún)?shù) sub_process = multiprocessing.Process(target=task, args=(5,) # kwargs: 表示以字典方式傳

27、入?yún)?shù) sub_process = multiprocessing.Process(target=task, kwargs=count: 4)多線程編程1 進(jìn)程與多進(jìn)程的使用4.進(jìn)程執(zhí)行帶有參數(shù)的任務(wù)(多線程編程2 線程與多線程的使用在Python中,線程是實(shí)現(xiàn)多任務(wù)的另外一種方式。1.什么是線程?線程是進(jìn)程中執(zhí)行代碼的一個(gè)分支,是CPU調(diào)度的基本單位,每個(gè)進(jìn)程至少都有一個(gè)線程。2.多線程的使用Python3 線程模塊為threading,多線程的使用步驟如下:(1)導(dǎo)入線程模塊import threading多線程編程2 線程與多線程的使用在Python中,線程是實(shí)現(xiàn)多線程編程2 線程與多線

28、程的使用(2)線程類Thread參數(shù)說明thread(group , target , name , args , kwargs)group: 線程組,目前只能使用Nonetarget: 執(zhí)行的目標(biāo)任務(wù)名args: 以元組的方式給執(zhí)行任務(wù)傳參kwargs: 以字典方式給執(zhí)行任務(wù)傳參name: 線程名,一般不用設(shè)置(3)啟動(dòng)線程:通常用start方法。多線程編程2 線程與多線程的使用(2)線程類Thread參數(shù)多線程編程2 線程與多線程的使用【例】通過多線程完成唱歌和跳舞兩個(gè)任務(wù)。import threadingimport time# 唱歌任務(wù)def sing(): # 擴(kuò)展: 獲取當(dāng)前線程

29、# print(sing當(dāng)前執(zhí)行的線程為:, threading.current_thread() for i in range(3): print(正在唱歌.%d % i) time.sleep(1)# 跳舞任務(wù)def dance(): # 擴(kuò)展: 獲取當(dāng)前線程 # print(dance當(dāng)前執(zhí)行的線程為:, threading.current_thread() for i in range(3): print(正在跳舞.%d % i) time.sleep(1)多線程編程2 線程與多線程的使用【例】通過多線程完成唱歌和跳多線程編程2 線程與多線程的使用【例】通過多線程完成唱歌和跳舞兩個(gè)任務(wù)

30、。if _name_ = _main_: # 擴(kuò)展: 獲取當(dāng)前線程 # print(當(dāng)前執(zhí)行的線程為:, threading.current_thread() # 創(chuàng)建唱歌的線程 # target: 線程執(zhí)行的函數(shù)名 sing_thread = threading.Thread(target=sing) # 創(chuàng)建跳舞的線程 dance_thread = threading.Thread(target=dance) # 開啟線程 sing_thread.start() dance_thread.start()運(yùn)行結(jié)果:正在唱歌.0正在跳舞.0正在唱歌.1正在跳舞.1正在唱歌.2正在跳舞.2多線程

31、編程2 線程與多線程的使用【例】通過多線程完成唱歌和跳多線程編程2 線程與多線程的使用3.線程執(zhí)行帶有參數(shù)的任務(wù)Thread類執(zhí)行任務(wù)并給任務(wù)傳參數(shù)有兩種方式:(1)args 表示以元組的方式給執(zhí)行任務(wù)傳參(2)kwargs 表示以字典方式給執(zhí)行任務(wù)傳參 # args: 以元組的方式給任務(wù)傳入?yún)?shù) sub_thread = threading.Thread(target=task, args=(4,) # kwargs: 表示以字典方式傳入?yún)?shù) sub_thread = threading.Thread(target=task, kwargs=count: 4)多線程編程2 線程與多線程的使用

32、3.線程執(zhí)行帶有參數(shù)的任務(wù)(多線程編程2 線程與多線程的使用3.線程執(zhí)行帶有參數(shù)的任務(wù)Thread類執(zhí)行任務(wù)并給任務(wù)傳參數(shù)有兩種方式:(1)args 表示以元組的方式給執(zhí)行任務(wù)傳參(2)kwargs 表示以字典方式給執(zhí)行任務(wù)傳參 # args: 以元組的方式給任務(wù)傳入?yún)?shù) sub_thread = threading.Thread(target=task, args=(4,) # kwargs: 表示以字典方式傳入?yún)?shù) sub_thread = threading.Thread(target=task, kwargs=count: 4)多線程編程2 線程與多線程的使用3.線程執(zhí)行帶有參數(shù)的任務(wù)

33、(多線程編程2 線程與多線程的使用在使用線程時(shí),要特別注意如下4點(diǎn):(1)線程執(zhí)行執(zhí)行是無序的(2)主線程默認(rèn)會(huì)等待所有子線程執(zhí)行結(jié)束再結(jié)束,設(shè)置守護(hù)主線程的目的是主線程退出子線程銷毀。(3)線程之間共享全局變量,好處是可以對(duì)全局變量的數(shù)據(jù)進(jìn)行共享。(4)線程之間共享全局變量可能會(huì)導(dǎo)致數(shù)據(jù)出現(xiàn)錯(cuò)誤問題,可以使用線程同步方式來解決這個(gè)問題。多線程編程2 線程與多線程的使用在使用線程時(shí),要特別注意如下多線程編程3 互斥鎖與死鎖1.互斥鎖互斥鎖是指對(duì)共享數(shù)據(jù)進(jìn)行鎖定,保證同一時(shí)刻只能有一個(gè)線程去操作。threading模塊中定義了Lock變量,這個(gè)變量本質(zhì)上是一個(gè)函數(shù),通過調(diào)用這個(gè)函數(shù)可以獲取一把互

34、斥鎖。# 創(chuàng)建鎖mutex = threading.Lock()# 上鎖mutex.acquire()# 釋放鎖mutex.release()注意點(diǎn):acquire和release方法之間的代碼同一時(shí)刻只能有一個(gè)線程去操作多線程編程3 互斥鎖與死鎖1.互斥鎖# 創(chuàng)建鎖注意點(diǎn):acq多線程編程3 互斥鎖與死鎖【例】使用互斥鎖完成2個(gè)線程對(duì)同一個(gè)全局變量各加10萬次的操作。import threading# 定義全局變量g_num = 0# 創(chuàng)建全局互斥鎖lock = threading.Lock()# 循環(huán)一次給全局變量加1def sum_num1(): # 上鎖 lock.acquire() for i in range(100000): global g_num g_num += 1 print(sum1:, g_num) # 釋放鎖 lock.release()# 循環(huán)一次給全局變量加1def sum_num2(): # 上鎖 lock.acquire() for i in range(100000): global g_num g_num += 1 print(sum2:, g_num) # 釋放鎖 lock.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論