生產者是一堆線程,消費者是另一堆線程,內存緩存區可以使用list數組隊列,數據類型是需要一個簡單的類就好。關鍵是如何處理多線程之間的協作。這其實也是多線程通信的一個範例
網絡編程:實現計算機與計算機之間的通信。
Pop3郵局協議版本 是tcp/ip協議族中的協議。
ftp文件傳輸協議
http基於tcp的協議。
Tcp協議是可靠可寫的狀態長鏈接的協議像打電話一樣。
Udp協議,不可靠無連接,像發短信一樣,發送的包的順序需要編號。
Qq視頻
Smtp簡單郵件傳輸協議。
郵件服務器
Web服務器
192.168.0.0 局域網都是用192.168.
IP地址分5類:
P地址分爲A,B,C,D,E五類。
網絡號:用於識別主機所在的網絡;
主機號:用於識別該網絡中的主機。
其中A類分配給政府機關使用,B類地址給大中型企業使用,C類地址給個人使用。這三種是主要的。
IP地址分爲五類,A類保留給政府機構,B類分配給中等規模的公司,C類分配給任何需要的人,D類用於組播,E類用於實驗,各類可容納的地址數目不同。
其中A類、B類、和C類這三類地址用於TCP/IP節點,其它兩類D類和E類被用於特殊用途。
A、B、C三類IP地址的特徵:當將IP地址寫成二進制形式時,A類地址的第一位總是O,B類地址的前兩位總是10,C類地址的前三位總是110。
1. A類地址
⑴ A類地址第1字節爲網絡地址,其它3個字節爲主機地址。
⑵ A類地址範圍:1.0.0.1—126.155.255.254 126是網絡IP
⑶ A類地址中的私有地址和保留地址:
① 10.X.X.X是私有地址(所謂的私有地址就是在互聯網上不使用,而被用在局域網絡中的地址)。
② 127.X.X.X是保留地址,用做循環測試用的。
2. B類地址
⑴ B類地址第1字節和第2字節爲網絡地址,其它2個字節爲主機地址。
⑵ B類地址範圍:128.0.0.1—191.255.255.254。192.255網絡IP
255.254主機IP
⑶ B類地址的私有地址和保留地址
① 172.16.0.0—172.31.255.255是私有地址
② 169.254.X.X是保留地址。如果你的IP地址是自動獲取IP地址,而你在網絡上又沒有找到可用的DHCP服務器。就會得到其中一個IP。
3. C類地址
⑴ C類地址第1字節、第2字節和第3個字節爲網絡地址,第4個個字節爲主機地址。另外第1個字節的前三位固定爲110。
⑵ C類地址範圍:192.0.0.1—223.255.255.254。223.255.255網絡地址
254主機地址
⑶ C類地址中的私有地址:
192.168.X.X是私有地址。
4. D類地址
⑴ D類地址不分網絡地址和主機地址,它的第1個字節的前四位固定爲1110。
⑵ D類地址範圍:224.0.0.1—239.255.255.254
5. E類地址
⑴ E類地址也不分網絡地址和主機地址,它的第1個字節的前五位固定爲11110。
⑵ E類地址範圍:240.0.0.1—255.255.255.254
域名 每一個IP地址都有唯一一個域名。域名和IP怎麼連接?是由域名服務器。
一個域名可以掛好幾個網站。
空間:申請域名空間,網站掛在空間裏。
域名服務器:com、cn、gov。
大型網站有多個服務器 (集羣)。
192.168.1.6
網慣和網段一樣192.168.220.0
服務器就是域名:離自己最近的服務器。
共享文件\\192.168.1.1
創建共享用戶:我的電腦-右鍵管理-用戶管理。
#
#生產者消費者模式
#首先,消費者函數從隊列中取一次數值然後調用q.task_done()通知生產者函數,<font color="#ff0000">該元素</font>我已經取過了,直到將全部元素取出。
# 在生產者函數中調用q.join()時,函數被掛起,直到隊列的數據被全部取走,函數才能繼續執行,生產者函數執行結束後,消費者函數還在等待隊列中的數據,
# 但此時消費者函數已經沒有存活的必要,所以當主進程結束時,可以將該執行消費者函數的子進程帶走,設置爲守護進程即可'''
import os
import time
from multiprocessing import Process, JoinableQueue
def producer0(q):
for i in range(5):
print('%s 生產了 %s' % (os.getpid(), i))
q.put(i)
q.join()
def producer1(q):
for i in range(5):
print('%s 生產了 %s' % (os.getpid(), i))
q.put(i)
q.join()
def producer2(q):
for i in range(5):
print('%s 生產了 %s' % (os.getpid(), i))
q.put(i)
q.join()
def consumer(q):
while 1:
res = q.get()
time.sleep(3)
print('%s 消費了 %s' % (os.getpid(), res))
q.task_done()
if __name__ == '__main__':
q = JoinableQueue()
p1 = Process(target=producer0, args=(q,))
p2 = Process(target=producer1, args=(q,))
p3 = Process(target=producer2, args=(q,))
p4 = Process(target=consumer, args=(q,))
p5 = Process(target=consumer, args=(q,))
p_l = [p1, p2, p3, p4, p5]
#數據取完後消費者還在等着數據加入隊列,但是生產者函數已經結束了,所以消費者可以隨着主進程的結束而結束,所以將消費者函數設置爲守護進程。
p4.daemon = True
p5.daemon = True
for p in p_l:
p.start()
p1.join()
p2.join()
p3.join()
print('主進程')
#-------------------------------
#正確表達式
#re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。
import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
#group(num=0) 匹配的整個表達式的字符串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
#groups() 返回一個包含所有小組字符串的元組,從 1 到 所含的小組號。
import re
line = "Cats are smarter than dogs"; #字符串
searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I) #r代表原樣輸出 .*代表任意字符 .*?代表只匹配第一個組合 reM代表多行匹配 帶括號的都是分組
if searchObj:
print("searchObj.group() : ", searchObj.group())
print("searchObj.group(1) : ", searchObj.group(1))
print("searchObj.group(2) : ", searchObj.group(2))
else:
print("Nothing found!!")
#------------------------------------------------------
#epl 參數是一個函數
#以下實例中將字符串中的匹配的數字乘於 2:
import re
# 將匹配的數字乘於 2
def double(matched):
value = int(matched.group('value'))
return str(value * 2)
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))
#----------------------------------------------------------------
#字符串日期轉換爲易讀的日期格式
import datetime
now = datetime.datetime.now()
print(now)
t_str = '2013-11-30 20:44:07'
d = datetime.datetime.strptime(t_str, '%Y-%m-%d %H:%M:%S')
#----------------------------------------------------------------------
#計算字符串中子串出現的次數
s="google.com"
print("o",s.count("o"))