欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決Python3.7.0 SSL低版本導(dǎo)致Pip無法使用問題

 更新時(shí)間:2020年09月03日 14:21:49   作者:polkabobo  
這篇文章主要介紹了解決Python3.7.0 SSL低版本導(dǎo)致Pip無法使用問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

終于下決心把python從2.7升到了3.7。懶人安裝當(dāng)然使用Anaconda。

安裝成功,編譯成功。但是用pip 安裝包的時(shí)候提示:

pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available。

原因是python3.7為了安全性考慮,要求使用openssl 1.0.2之后的版本。但是自帶的openssl,版本是1.0.1。

解決辦法:

重裝一下openssl

進(jìn)入

Anaconda Prompt:

conda install -c anaconda openssl

就一切解決了哈啊哈!完美!

補(bǔ)充知識:Python3使用multiprocessing多進(jìn)程模塊共享變量

在使用Python用CPU跑一個(gè)人臉識別的模塊,神經(jīng)網(wǎng)絡(luò)的計(jì)算比較耗時(shí),因?yàn)镻ython GIL的限制,因此這里使用多進(jìn)程來并行跑數(shù)據(jù)集。

在多個(gè)進(jìn)程之間共享簡單變量

有很多張人臉圖片,現(xiàn)在使用8個(gè)進(jìn)程來分別對人臉圖片進(jìn)行識別,但是要知道總的進(jìn)度和正確率,因此這里要在各個(gè)進(jìn)程之間共享變量。這里需要的只是整型無符號變量。

在對總的進(jìn)度和準(zhǔn)確率進(jìn)行計(jì)算的時(shí)候要加鎖,防止別的進(jìn)程改變

在使用 print輸出的時(shí)候要加鎖,因?yàn)榭刂婆_也是資源,要防止搶占

加鎖了之后要記得釋放鎖

假設(shè)8個(gè)進(jìn)程共識別了count張圖片,然后正確的圖片有correct張。思路如下:

在主進(jìn)程中聲明要共享的count和correct變量,初始化進(jìn)程的時(shí)候傳入

在各個(gè)進(jìn)程中識別一張圖片count就自增1,識別正確的話correct也要自增1,自增的時(shí)候要加鎖

控制臺輸出相關(guān)信息的時(shí)候也要加鎖

# l代表長整型無符號變量
count = multiprocessing.Value('l', 0)
correct = multiprocessing.Value('l', 0)
lock = multiprocessing.Lock()

# 要運(yùn)行的函數(shù)為run(),lis為劃分給每個(gè)進(jìn)程的識別圖片列表
p = [multiprocessing.Process(target=run, args=(lock, i, count, correct)) for i in lis]

for i in p:
  i.start()
for i in p:
  i.join()

在run函數(shù)中:

# 多個(gè)線程對共享變量進(jìn)行操作,加鎖
lock.acquire()
# 圖片已經(jīng)識別完畢,總數(shù)加一
count.value += 1
# 下面兩個(gè)if分別為識別正確的情況
if i[0] == 3 and dis >= threshold:
  correct.value += 1
  print("正確率:{0:.5f} 總數(shù):{1} 正確數(shù):{2} 錯(cuò)誤數(shù):{3} 參數(shù)個(gè)數(shù):{4} 向量夾角:{5:.5f} 圖片1:{6} 圖片2:{7}".format(correct.value/count.value, count.value, correct.value, count.value-correct.value, i[0], dis[0], i[1], i[2]))
  lock.release()
  continue
if i[0] == 4 and dis < threshold:
  correct.value += 1
  print("正確率:{0:.5f} 總數(shù):{1} 正確數(shù):{2} 錯(cuò)誤數(shù):{3} 參數(shù)個(gè)數(shù):{4} 向量夾角:{5:.5f} 圖片1:{6} 圖片2:{7}".format(correct.value/count.value, count.value, correct.value, count.value-correct.value, i[0], dis[0], i[1], i[2]))
  lock.release()
  continue
print("識別錯(cuò)誤:參數(shù)個(gè)數(shù):{0} 向量夾角:{1} 圖片1:{2} 圖片2:{3}".format(i[0], dis[0], i[1], i[2]))
# 不要遺漏解鎖,否則進(jìn)程會死鎖
lock.release()

在多個(gè)進(jìn)程中共享字典dict

準(zhǔn)備把識別過的照片特征緩存起來,因此這里使用字典,key就是照片名稱,value就是特征值。在此使用mutiprocessing.Manage()來實(shí)現(xiàn)。

manager = multiprocessing.Manager()
# 這個(gè)是用來在多個(gè)進(jìn)程中間共享的字典
sync_dict = manager.dict()
# 這個(gè)是使用pickle序列化到文件中用的臨時(shí)字典變量
mem_dict = dict()

# 如果存在字典就載入,使用臨時(shí)字典中轉(zhuǎn)是因?yàn)閟ysnc_dict直接序列化會在下次加載時(shí)導(dǎo)致Manager在多個(gè)進(jìn)程中的連接出現(xiàn)問題
if os.path.exists("./muti_thread_mem.pkl"):
  with open("./muti_thread_mem.pkl", "rb") as f:
    mem_dict = pickle.load(f)
  for i in mem_dict:
    sync_dict[i] = mem_dict[i]

使用multiprocessing.Manager()時(shí)就不用加鎖了,它本身帶有同步的功能。在run函數(shù)中直接使用就好了。

if i[1] in sync_dict:
 # 有記錄就直接讀取緩存
  encoding1 = sync_dict[i[1]]
else:
 # 沒記錄就計(jì)算出來再緩存一下
  face.file = Image.open(prefix+i[1])
  encoding1 = face.encodings
  sync_dict[i[1]] = encoding1
if i[2] in sync_dict:
  encoding2 = sync_dict[i[2]]
else:
  face.file = Image.open(prefix+i[2])
  encoding2 = face.encodings
  sync_dict[i[2]] = encoding2

如果緩存過就直接讀取,如果沒有緩存過就計(jì)算后然后再緩存一下,便于下次讀取。大多都是業(yè)務(wù)的邏輯,沒有什么意思。算完了之后在主程序退出之前再緩存到本地就好了。

with open("./muti_thread_mem.pkl", 'wb') as f:
  for k, v in enumerate(sync_dict):
    mem_dict[v] = sync_dict[v]
  if len(mem_dict):
   # 傳入的4就是想試一下Python新版本的特性而已,沒啥其他意思
    pickle.dump(mem_dict, f, 4)

在Pycharm里面運(yùn)行代碼的時(shí)候會碰到一些問題。

使用Pycharm的Python console運(yùn)行代碼的時(shí)候會導(dǎo)致一個(gè)進(jìn)程完成任務(wù)之后,join等待主線程退出的時(shí)候,所有進(jìn)程都報(bào)錯(cuò)pipe broken連接不到Manager的共享字典。但是使用本地Terminal運(yùn)行的時(shí)候,一個(gè)進(jìn)程完成任務(wù)后是不會導(dǎo)致其他進(jìn)程報(bào)錯(cuò)的,因此推斷這里是Pycharm的坑。

關(guān)鍵字:multiprocessing.Manager()報(bào)錯(cuò)pipe broken,進(jìn)程獲取共享變量時(shí)異常,導(dǎo)致所有進(jìn)程退出

調(diào)試代碼(Pycharm debug模式)的時(shí)候也會導(dǎo)致調(diào)試過程中進(jìn)程連接不到Manager的共享字典變量。

這些坑都涉及到Manager在共享變量時(shí)使用的客戶端/服務(wù)端模式,最后socket連接報(bào)錯(cuò),所有進(jìn)程讀取共享變量時(shí)報(bào)錯(cuò)退出。我這次的解決方式是不要啟用Pycharm的Python console來運(yùn)行代碼就好了。

以上這篇解決Python3.7.0 SSL低版本導(dǎo)致Pip無法使用問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論