python之路——40
Posted wan2-0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python之路——40相关的知识,希望对你有一定的参考价值。
复习
1.管道
2.数据共享 Manager
3.进程池
1.map
1.返回所有结果列表
2.异步 自带close和join
2.apply
1.同步
3.apply_async
1.异步:func被注册进入一个进程,程序继续执行
2.返回值为一个相关对象
学习内容
1.线程与进程
1.进程——最小的内存分配单位
2.线程——操作系统调度的最小单位
3.线程被CPU执行
4.进程至少含有一个线程
5.起线程需要的时间和空间小于进程
6.多个线程内部有自己的数据栈,这个不能共享
7.全局变量在多个线程间共享
2.起线程的两种方式
3.进程中存储:导入的模块,文件所在的位置,代码,
主线程:主线程代码中的变量、对象
子线程:少量必要的数据
4.全局解释器锁 GIL
1.锁的是线程
2.导致cpu利用率不充分,保证数据安全
3.不是python的问题,是Cpython解释器的问题
4.编译型语言——编译后,很大程度避免了数据安全问题
解释性语言
5.高CPU:计算类——高CPU利用率
高IO:多延时
代码区
1.多进程 爬取网页代码长度
from multiprocessing import Pool from urllib.request import urlopen def get(url): ret = urlopen(url) return url, ret.read().decode(‘utf-8‘) def handle(args): url, content = args print(url,len(content)) if __name__ == ‘__main__‘: url_lst = [ ‘http://www.baidu.com‘, ‘https://pan.baidu.com/s/1UwzvTS5o0MB2KQSerNeaWA?fid=809605274381911‘, ‘http://gufenso.coderschool.cn/#‘ ‘http://www.miit.gov.cn/‘ ] p = Pool() for url in url_lst: p.apply_async(get,args=(url,),callback=handle) p.close() p.join()
2.多进程 爬取电影
import re from multiprocessing import Pool from urllib.request import urlopen def get_page(url,pattern): response = urlopen(url).read().decode(‘utf-8‘) return pattern,response def parse_page(info): pattern, ret = info res = re.findall(pattern,ret) ret_str = ‘‘ for item in res: dic1={ ‘index‘:item[0].strip(), ‘title‘:item[1].strip(), ‘actor‘:item[2].strip(), ‘time‘:item[3].strip(), } dic1_str = str(dic1) + ‘\n‘ ret_str = dic1_str + ret_str print(ret_str) return ret_str if __name__ == ‘__main__‘: # 生成带handel网页列表 url_lst = [] for i in range(0,91,10): url_lst.append(‘https://maoyan.com/board/4?offset=%d‘%i) print(url_lst) # 正则编译 regex = r‘<dd>.*?<i class="board-index board-index-.*?">(\d+)</i>.*?title="(.*?)".*?"star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?</dd>‘ pattern = re.compile(regex,re.S) # 起进程 res_l = [] p = Pool() for url in url_lst: res = p.apply_async(get_page,args=(url,pattern),callback=parse_page) res_l.append(res) p.close() p.join()
3.线程
import time,os from threading import Thread def func(i): time.sleep(1) global g if g == 100: g = 0 print(‘in %s,%s‘%(i,g)) print(‘in func %s, pid:%s,g=%s‘%(i,os.getpid(),g)) g = 100 t_list = [] for i in range(10): t = Thread(target=func,args=(i,)) t.start() t_list.append(t) for i in t_list:i.join() print(g)
4.多线程 效率
from multiprocessing import Process from threading import Thread import time def func(n): n + 1 if __name__ == ‘__main__‘: p_list = [] t_sta1 = time.time() for i in range(100): p = Process(target=func,args=(i,)) p.start() p_list.append(p) for i in p_list: i.join() t1 = time.time() - t_sta1 t_list = [] t_sta2 = time.time() for i in range(100): t = Thread(target=func,args=(i,)) t.start() t_list.append(t) for i in t_list: i.join() t2 = time.time() - t_sta2 print(t1,t2)
5.threading模块方法
import threading threading.current_thread() threading.get_ident() threading.active_count() # 包括主线程 threading.enumerate()
6.多线程实现socketserver
# server import socket from threading import Thread def func(conn): while True: info = input(‘>>> ‘) conn.send(info.encode(‘utf-8‘)) msg = conn.recv(1204).decode(‘utf-8‘) print(msg) sk = socket.socket() sk.bind((‘127.0.0.1‘,8080)) sk.listen() while True: conn, addr = sk.accept() t = Thread(target=func,args=(conn,)) t.start() conn.close() sk.close() #client import socket sk = socket.socket() sk.connect((‘127.0.0.1‘,8080)) while 1: msg = sk.recv(1024).decode(‘utf-8‘) print(msg) ret = input(‘>>> ‘) sk.send(ret.encode(‘utf-8‘)) sk.close()
以上是关于python之路——40的主要内容,如果未能解决你的问题,请参考以下文章