线程的基本使用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import threading # ###################### 1.线程的基本使用 def func(arg): print(arg) t = threading.Thread(target=func,args=(11,)) t.start() print(123) # #################### 2.主线程默认等子线程执行完毕 mport time def func(arg): time.sleep(arg) print(arg) t1 = threading.Thread(target=func,args=(3,)) t1.start() t2 = threading.Thread(target=func,args=(9,)) t2.start() print(123) # ############ 3.主线程不再等,主线程终止则所有子线程终止 import time def func(arg): time.sleep(2) print(arg) t1 = threading.Thread(target=func,args=(3,)) t1.setDaemon(True) t1.start() t2 = threading.Thread(target=func,args=(9,)) t2.setDaemon(True) t2.start() print(123) # ######### 4.开发者可以控制主线程等待子线程(最多等待时间) import time def func(arg): time.sleep(0.01) print(arg) print('创建子线程t1') t1 = threading.Thread(target=func,args=(3,)) t1.start() # 无参数,让主线程在这里等着,等到子线程t1执行完毕,才可以继续往下走。 # 有参数,让主线程在这里最多等待n秒,无论是否执行完毕,会继续往下走。 t1.join(2) print('创建子线程t2') t2 = threading.Thread(target=func,args=(9,)) t2.start() t2.join(2) # 让主线程在这里等着,等到子线程t2执行完毕,才可以继续往下走。 print(123)
(附加:获取当前执行该函数的线程的对象)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(arg): # 获取当前执行该函数的线程的对象 t = threading.current_thread() # 根据当前线程对象获取当前线程名称 name = t.getName() print(name,arg) t1 = threading.Thread(target=func,args=(11,)) t1.setName('侯明魏') t1.start() t2 = threading.Thread(target=func,args=(22,)) t2.setName('刘宁钱') t2.start() print(123)
线程池:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
from concurrent.futures import ThreadPoolExecutor import time def task(a1,a2): time.sleep(2) print(a1,a2) # 创建了一个线程池(最多5个线程) pool = ThreadPoolExecutor(5) for i in range(40): # 去线程池中申请一个线程,让线程执行task函数。 pool.submit(task,i,8)
进程的基本使用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# ##################### 进程间的数据不共享 import multiprocessing data_list = [] def task(arg): data_list.append(arg) print(data_list) def run(): for i in range(10): p = multiprocessing.Process(target=task,args=(i,)) # p = threading.Thread(target=task,args=(i,)) p.start() if __name__ == '__main__': run() # ##################### 进程常用功能 import time def task(arg): time.sleep(2) print(arg) def run(): print('111111111') p1 = multiprocessing.Process(target=task,args=(1,)) p1.name = 'pp1' p1.start() print('222222222') p2 = multiprocessing.Process(target=task, args=(2,)) p2.name = 'pp2' p2.start() print('333333333') if __name__ == '__main__': run() # ##################### 通过继承方式创建进程 class MyProcess(multiprocessing.Process): def run(self): print('当前进程',multiprocessing.current_process()) def run(): p1 = MyProcess() p1.start() p2 = MyProcess() p2.start() if __name__ == '__main__': run()
进程数据共享:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# ############ 进程间的数据共享:multiprocessing.Queue import multiprocessing q = multiprocessing.Queue() def task(arg,q): q.put(arg) def run(): for i in range(10): p = multiprocessing.Process(target=task, args=(i, q,)) p.start() while True: v = q.get() print(v) run() # ##################### 进程间的数据共享:Manager def task(arg,dic): time.sleep(2) dic[arg] = 100 if __name__ == '__main__': m = multiprocessing.Manager() process_list = [] for i in range(10): p = multiprocessing.Process(target=task, args=(i,dic,)) p.start() process_list.append(p) while True: count = 0 for p in process_list: if not p.is_alive(): count += 1 if count == len(process_list): break print(dic) # ##################### 进程间的数据其他电脑 def task(arg,dic): pass if __name__ == '__main__': while True: # 连接上指定的服务器 # 去机器上获取url url = 'adfasdf' p = multiprocessing.Process(target=task, args=(url,)) p.start()
进程池:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import time from concurrent.futures import ProcessPoolExecutor def task(arg): time.sleep(2) print(arg) if __name__ == '__main__': pool = ProcessPoolExecutor(5) for i in range(10): pool.submit(task,i)