系列文章目录
前言
学习python3中线程池的用法鱼进程池的用法一、python3线程的基本用法
Python中使用线程有两种方式:函数或者用类来包装线程对象
1.1 函数调用方法
thread.start_new_thread ( function, args[, kwargs] )
参数说明:
function - 线程函数。
args - 传递给线程函数的参数,他必须是个tuple类型。
kwargs - 可选参数。
代码示例:
#! /usr/bin/env python3
import _thread
import datetime
import time
def print_time(currentName,sleepTime):
while 1:
nowTime = datetime.datetime.now()
print(nowTime, currentName)
time.sleep(sleepTime)
if __name__ == '__main__':
try:
_thread.start_new_thread(print_time, ('Thead-1',1))
_thread.start_new_thread(print_time, ('Thread-2',2))
except BaseException as e:
print(e)
#阻止主线程退出
while 1:
pass
1.2 类包装对象
示例:
#!/usr/bin/env python3
import threading
import datetime
import time
class MyThread(threading.Thread):
def __init__(self,name,time):
threading.Thread.__init__(self)
self.name = name
self.time = time
def run(self):
while 1:
nowTime = datetime.datetime.now()
print(nowTime, self.name)
time.sleep(self.time)
if __name__ == '__main__':
try:
t1 = MyThread('Thread-1', 1) #创建线程1
t2 = MyThread('Thread-2', 2) #创建线程2
t1.start() #启动线程
t2.start() #启动线程
#等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生
t1.join()
t2.join()
print('退出主线程')
except BaseException as e:
print(e)
二、线程池的用法
示例:
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
def fn(name):
for i in range(1000):
print(name,i)
return name
if __name__ == '__main__':
#创建线程池
with ThreadPoolExecutor(50) as pool:
for i in range(100):
pool.submit(fn,name="线程(%s)"%(i))
print('over')
示例二:
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import requests
def goUrl(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
}
response = requests.get(url=url,headers=headers)
# with open(fileName,'wb') as f:
# f.write(response.content)
print(response)
return {'url': url, 'content': response.text}
def parse(res):
result = res.result()
print(result)
if __name__ == '__main__':
urls = [
'https://www.runoob.com/python3/python3-multithreading.html',
'https://www.bilibili.com/video/BV17i4y1N77j?p=57&spm_id_from=pageDriver',
'https://blog.csdn.net/please_fix_/article/details/105149082'
]
#创建一个线程池
with ThreadPoolExecutor(3) as pool:
for url in urls:
pool.submit(goUrl, url).add_done_callback(parse)
三.进程的用法
3.1 进程使用实例
#!/usr/bin/env python
from multiprocessing import Process
def func():
for i in range(1,1000):
print('子进程',i)
def run():
p = Process(target = func)
p.start()
for index in range(1,1000):
print('主进程',index)
if __name__ == '__main__':
run()
3.2 进程池使用实例
#!/usr/bin/env python3
import time
from concurrent.futures import ProcessPoolExecutor
import datetime
def print_time(name):
nowTime = datetime.datetime.now()
print(nowTime, name)
time.sleep(1)
return nowTime
def callBack(res):
print(res.result())
if __name__ == '__main__':
with ProcessPoolExecutor(3) as pool:
for i in range(0,3):
pool.submit(print_time,'Process-%s'%i).add_done_callback(callBack)
参考文章
1.https://www.cnblogs.com/Xuuuuuu/p/10338504.html
2.https://www.runoob.com/python3/python3-multithreading.html