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.多进程 爬取网页代码长度python

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.多线程 效率app

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.多线程实现socketserversocket

# 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()
相关文章
相关标签/搜索