16.threading.local的作用?
# 答案:
為每個線程創建一個獨立的空間,使得線程對自己的空間中的數據進行操作(數據隔離)。
import threading
from threading import local
import time
obj = local()
def task(i):
obj.xxxxx = i
time.sleep(2)
print(obj.xxxxx,i)
for i in range(10): #開啟了10個線程
t = threading.Thread(target=task,args=(i,))
t.start()
17.進程之間如何進行通信?
# 答案:
python提供了多種進程通信的方式,主要Queue和Pipe這兩種方式,Queue用於多個進程間實現通信,Pipe是兩個進程的通信。
# Queue
from multiprocessing import Process, Queue
import os,time,random
#寫數據進程執行的代碼
def proc_write(q,urls):
print 'Process is write....'
for url in urls:
q.put(url)
print 'put %s to queue... ' %url
time.sleep(random.random())
#讀數據進程的代碼
def proc_read(q):
print('Process is reading...')
while True:
url = q.get(True)
print('Get %s from queue' %url)
if __name__ == '__main__':
#父進程創建Queue,並傳給各個子進程
q = Queue()
proc_write1 = Process(target=proc_write,args=(q,['url_1','url_2','url_3']))
proc_write2 = Process(target=proc_write,args=(q,['url_4','url_5','url_6']))
proc_reader = Process(target=proc_read,args=(q,))
#啟動子進程,寫入
proc_write1.start()
proc_write2.start()
proc_reader.start()
#等待proc_write1結束
proc_write1.join()
proc_write2.join()
#proc_raader進程是死循環,強制結束
proc_reader.terminate()
# PIPE
import multiprocessing
import os,time,random
#寫數據進程執行的代碼
def proc_send(pipe,urls):
#print 'Process is write....'
for url in urls:
print 'Process is send :%s' %url
pipe.send(url)
time.sleep(random.random())
#讀數據進程的代碼
def proc_recv(pipe):
while True:
print('Process rev:%s' %pipe.recv())
time.sleep(random.random())
if __name__ == '__main__':
#父進程創建pipe,並傳給各個子進程
pipe = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=proc_send,args=(pipe[0],['url_'+str(i) for i in range(10) ]))
p2 = multiprocessing.Process(target=proc_recv,args=(pipe[1],))
#啟動子進程,寫入
p1.start()
p2.start()
p1.join()
p2.terminate()
18.什么是並發和並行?
# 答案:
# 並發:同一時刻只能處理一個任務,但可以交替處理多個任務。(一個處理器同時處理多個任務)
# 並行:同一時刻可以處理多個任務。(多個處理器或者是多核的處理器同時處理多個不同的任務)
# 類比:並發是一個人同時吃三個饅頭,而並行是三個人同時吃三個饅頭。
19.同步和異步,阻塞和非阻塞的區別?
# 答案:
'''
同步:執行一個操作之后,需要主動等待返回結果;
異步:執行一個操作之后,不需要主動等待返回結果,若接收到結果通知,再回來執行剛才沒執行完的操作。
同步和異步關心的問題是:要不要主動等待結果。
阻塞:在執行一個操作時,不能做其他操作;
非阻塞:在執行一個操作時,能做其他操作。
阻塞和非阻塞關心的問題是:能不能做其他操作。
'''
20.路由器和交換機的區別?
# 答案:
'''
1:交換機:是負責內網里面的數據傳遞(arp協議)根據MAC地址尋址。
路由器:在網絡層,路由器根據路由表,尋找該ip的網段。
2:路由器可以把一個IP分配給很多個主機使用,這些主機對外只表現出一個IP。
交換機可以把很多主機連起來,這些主機對外各有各的IP。
3:交換機是做端口擴展的,也就是讓局域網可以連進來更多的電腦。
路由器是用來做網絡連接,也就是連接不同的網絡。
'''