学习多进程,当运行代码:
from concurrent.futures import ProcessPoolExecutor
import requests
import os
def get_page(url):
print('<%s> is getting [%s]' % (os.getpid(), url))
response = requests.get(url)
if response.status_code == 200: # 200代表状态:下载成功了
return {'url': url, 'text': response.text}
def parse_page(res):
res = res.result()
print('<%s> is getting [%s]' % (os.getpid(), res['url']))
with open('db.txt', 'a') as f:
parse_res = 'url:%s size:%s\n' % (res['url'], len(res['text']))
f.write(parse_res)
if __name__ == '__main__':
p = ProcessPoolExecutor()
l = [
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
]
for url in l:
p.submit(get_page, url).add_done_callback(parse_page)
# 这里的回调函数拿到的是一个对象。
# 得先把返回的res得到一个结果。即在前面加上一个res.result() #谁好了谁去掉回调函数
# 回调函数也是一种编程思想。不仅开线程池用,开线程池也用
p.shutdown() # 相当于进程池里的close和join
print('主', os.getpid())
出现
Exception in thread QueueManagerThread:
Traceback (most recent call last):
...
ValueError: need at most 63 handles, got a sequence of length 65
后来在p = ProcessPoolExecutor()括号内添加参 max_workers=3,就不报错了。
多线程的话,不需要在ThreadPoolExecutor()括号内添加max_workers参数。
from concurrent.futures import ThreadPoolExecutor
import requests
import os
def get_page(url):
print('<%s> is getting [%s]' % (os.getpid(), url))
response = requests.get(url)
if response.status_code == 200: # 200代表状态:下载成功了
return {'url': url, 'text': response.text}
def parse_page(res):
res = res.result()
print('<%s> is getting [%s]' % (os.getpid(), res['url']))
with open('db.txt', 'a') as f:
parse_res = 'url:%s size:%s\n' % (res['url'], len(res['text']))
f.write(parse_res)
if __name__ == '__main__':
p = ThreadPoolExecutor()
l = [
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
]
for url in l:
p.submit(get_page, url).add_done_callback(parse_page)
# 这里的回调函数拿到的是一个对象。
# 得先把返回的res得到一个结果。即在前面加上一个res.result() #谁好了谁去掉回调函数
# 回调函数也是一种编程思想。不仅开线程池用,开线程池也用
p.shutdown() # 相当于进程池里的close和join
print('主', os.getpid())
https://www.cnblogs.com/dylan-wu/p/7163823.html