1. 程式人生 > 其它 >Heine-Borel 有限覆蓋定理及其他情況

Heine-Borel 有限覆蓋定理及其他情況

# coding=utf-8
# 多程序

# # multiprocessing
# > 要充分的利用多核CPU資源。需要使用多程序,這個包叫multiprocessing
# 藉助它,可以輕鬆完成從單程序到併發執行的轉換。
# 提供了Process、Queue、Pipe、Lock 等元件。


# # # Process
# > 基本使用

# 在 multiprocessing 中,每一個程序都用一個 Process 類來表示。首先看下它的 API
# Process([group [, target [, name [, args [, kwargs]]]]])

# target表示呼叫物件,你可以傳入方法的名字
# args 表示被呼叫物件的位置引數元組,比如 target 是函式 a,他有兩個引數 m,n,那麼 args 就傳入 (m, n) 即可
# Kwargs 表示呼叫物件的字典
# name 是別名,相當於給這個程序取一個名字
# group分組,實際上不適用

#
# import multiprocessing
# import time
#
# def process(num):
# time.sleep(num)
# print("Process",num)
#
# if __name__ == '__main__':
# for i in range(5):
# p = multiprocessing.Process(target=process,args=(i,))
# p.start()
#
# print("CPU number:" + str(multiprocessing.cpu_count()))
# # CPU number:8
# for p in multiprocessing.active_children():
# print(f"Child process name:{p.name} id {str(p.pid)}")
# """
# Child process name:Process-3 id 17376
# Child process name:Process-1 id 17932
# Child process name:Process-4 id 14996
# Child process name:Process-5 id 892
# Child process name:Process-2 id 19784
# """
# print('Process Ended')
# 可以通過cpu_count()方法還有active_children()方法獲取當前機器的CPU核心數量以及得到目前所有的執行的程序。


# 自定義類

# from multiprocessing import Process
# import time
#
#
# class MyProcess(Process):
# def __init__(self,loop):
# Process.__init__(self)
# self.loop = loop
#
# def run(self):
# for count in range(self.loop):
# time.sleep(1)
# print('Pid: '+str(self.pid)+" LoopCount: "+str(count))
#
# if __name__ == '__main__':
# for i in range(2,5):
# p = MyProcess(i)
# p.start()



# # daemon
# > 這裡介紹一個屬性,叫做daemon。每個執行緒都可以單獨設定它的屬性,如果設定為True,
# 當父類程序的結束後,子程序會自動被終止。
# daemon=True
# 在後面要加join()方法
# 這樣主節點就會等所有的子節點執行完畢在結束

# from multiprocessing import Process
# import time
#
#
# class MyProcess(Process):
# def __init__(self,loop):
# Process.__init__(self)
# self.loop = loop
#
# def run(self):
# for count in range(self.loop):
# time.sleep(1)
# print('Pid: '+str(self.pid)+" LoopCount: "+str(count)+ "\n")
#
# if __name__ == '__main__':
# for i in range(2,5):
# p = MyProcess(i)
# p.daemon = True
# p.start()
# p.join()
#
# print("Main process Ended!")


# # Lock
# > 使用Lock就可以避免程序同時佔用資源而導致的一些問題

# from multiprocessing import Process,Lock
# import time
#
# class MyProcess(Process):
# def __init__(self,loop,lock):
# Process.__init__(self)
# self.loop = loop
# self.lock = lock
#
# def run(self):
# for count in range(self.loop):
# time.sleep(0.1)
# self.lock.acquire() # 獲取鎖
# print("Pid "+str(self.pid)+" LoopCount "+str(count))
# self.lock.release() # 釋放鎖
#
# if __name__ == '__main__':
# lock = Lock()
# for i in range(10,15):
# p = MyProcess(i,lock)
# p.start()

# # Pool
# > Pool可以提供指定數量的程序,給使用者呼叫,
# 當有新的請求提交到Pool中,如果程序池沒有滿,就會建立有一個新的程序倆執行請求
# 如果已經滿了,該請求會等待,直到程序池中的程序結束,才會建立新的程序

# Pool 的用法有阻塞和非阻塞兩種方式

# # 非阻塞(apply_async) 阻塞(apply)

# from multiprocessing import Lock,Pool
# import time
#
# def function(index):
# print("Start process",index)
# time.sleep(3)
# print("End process",index)
# # return index
#
# if __name__ == '__main__':
# pool = Pool(processes=3)
# for i in range(4):
# pool.apply_async(function,(i,)) # 非阻塞
# pool.apply(function,(i,)) # 阻塞
#
# print("started processes")
# # pool.terminate() # terminate () 結束工作程序,不在處理未完成的任務。
# pool.close() # 關閉pool,使其不在接收新任務
# pool.join() # join () 主程序阻塞,等待子程序的退出, join 方法要在close 或terminate 之後使用
# print('Subprocess done')


# # # map方法
# > 另一個非常好用的map方法,如果有一堆資料要處理,每一項都需要經過一個方法來處理,可以使用map方法
#


import multiprocessing
import requests

def scrape(url):
try:
print(requests.get(url))
except requests.exceptions.ConnectionError: # 找出網路請求失敗的url
print("Error Occured",url)
finally:
print("url",url,"scraped")

if __name__ == '__main__':
pool = multiprocessing.Pool(processes=3) # 初始化一個Pool,指定程序數3
# pool = multiprocessing.Pool() # 如果不指定會自動分配url
urls = [
'https://www.baidu.com',
'http://www.meituan.com/',
'http://blog.csdn.net/',
'http://xxxyxxx.net'
]
pool.map(scrape,urls)
# map函式可以遍歷每個url,然後對其他分別執行scrape方法