#Manager 实现进程间数据共享
from multiprocessing import Manager,Lock,Process
def func(dict1,lock1,str1):
    with lock1:
        print(dict1['count'])  #100  感觉像是dict字典被Manager创建了以后,就可以在进程之间传递信息了
        print(str1)
        print(f'子进程dict地址{id(dict1)}') #【内容一样,但是主进程 和子进程 dict对象的地址为啥还是不一样?】
        print(f'子进程str地址{id(str1)}')
if __name__ == '__main__':
    lock = Lock()
    str1 = 'hello'
    with Manager() as m:
        dic = m.dict({'count':100}) #把字典放到Manager对象中
        print(f'主进程dict地址{id(dic)}')
        print(f'主进程str地址{id(str1)}')
        # p_list = []
        # for i in range(100):
        #     p = Process(target=func,args=(dic,lock))
        #     p.start()
        #     p_list.append(p)
        # for p in p_list:
        #     p.join()
        p = Process(target=func,args=(dic,lock,str1))
        p.start()
        p.join()
#进程池
    #进程的开启和关闭也需要时间
    #开启过多的进程,影响操作系统调度
#multiprocess.Pool模块
#创建
from multiprocessing import Pool,Process
def func(x):return x*x
if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(func,[1,2,3])) #[1,4,9]  这里是在主进程里打印的
#同步进程池
from multiprocessing import Pool
import time
def func(n):
    # time.sleep(2)
    return n**2
if __name__ == '__main__':
    p = Pool(3) #3 个进程
    res_list = []
    for i in range(10):
        res = p.apply(func,args=(i,))
        res_list.append(res)
    print(res_list) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

#异步进程池
from multiprocessing import Pool
import time
import random
import os
def func(n):
    print(f'{os.getpid()}进程开始') #可以看到,总共只有3个进程编号
    time.sleep(random.randint(1,3))
    print(f'{os.getpid()}进程结束')
    return n**2

if __name__ == '__main__':
    p = Pool(3) #创建3个子进程
    res_list = []
    for i in range(10):
        res = p.apply_async(func,args=(i,)) #异步运行?但是前面res在等结果啊?进程池不用start
        print(time.asctime()) # 打印获得进程结束的时间
        res_list.append(res) #主进程把  返回值放入列表

    p.close() #进程池也可以关闭
    p.join() #把进程池 join了
    for res in res_list:
        print(res.get())  #这里使用get方法来获取apply_aync的结果,如果是apply同步的方法,就没有get方法,因为同步方法直接等获得结果才执行下一个
        #最终打印10个数字的平方,从打印结果看,各个进程是按0-9的顺序执行的
#进程池的方式实现和多人聊天
from socket import *
from multiprocessing import Pool
import os
sk = socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #如果这里不加这一句会提示:OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
sk.bind(('127.0.0.1',19083))
sk.listen()

def talk(conn):
    while 1:
        print(f'{os.getpid()}进程接受并发送信息')
        msg = conn.recv(1024)
        conn.send(msg.upper())
    conn.close()
if __name__ == '__main__':
    print('主进程开启。。。')
    p = Pool(3) #进程池有3个子进程 如果开启来4个客户端就会造成有个人在等着用进程,前面三个聊天结束,关闭客户端,第四个客户端就得到进程池中的一个进程
    while 1:
        conn, _ = sk.accept()
        res = p.apply_async(talk,args=(conn,)) #异步
        #p.join() #这里不能加join方法

sk.close()
#client端
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',19083))
while 1:
    str1 = input('>>>')
    sk.send(str1.encode('utf-8'))
    msg = sk.recv(1024).decode('utf-8')
    print(msg)
#使用多进程请求多个url 来减少网络等待浪费的时间
from multiprocessing import Pool
import requests
import json
import os

def get_page(url): #获取页面
    response = requests.get(url)
    if response.status_code == 200:
        return {'url':url,'text':response.text}
def parse_page(res): #解析页面
    print('<进程%s> parse %s' % (os.getpid(), res['url']))
    parse_res = 'url:<%s> size:[%s]\n' % (res['url'], len(res['text']))
    with open('db.txt', 'a') as f:
        f.write(parse_res)

if __name__ == '__main__':
    urls = [
        'https://www.baidu.com',
        'https://www.python.org',
        'https://www.openstack.org',
        'https://help.github.com/',
        'http://www.sina.com.cn/'
    ]
    p = Pool(3)
    res_list = []
    for url in urls:
        res = p.apply_async(get_page,args=(url,),callback=parse_page) #那么回调函数是在主进程里执行的么?这里的res,put进去了从get_page 返回的内容
        res_list.append(res) #这里进程池里虽然有3个进程但是,结果列表里有5个结果
    p.close()
    p.join()
    print(len(res_list)) #5
    print([res.get() for res in res_list]) # 把进程池里的进程,返回的值get出来,并显示
#没查到内容 可能反爬了?还是有局部刷新ajax?
import re
from urllib.request import urlopen
from multiprocessing import Pool

def get_page(url,pattern):
    response = urlopen(url).read().decode('utf-8')
    print(response)
    return pattern,response
def parse_page(info):
    pattern,page_content = info #这里的info是res么
    res = re.findall(pattern, page_content)
    for item in res:
        dic = {
            'index': item[0].strip(),
            'title': item[1].strip(),
            'actor': item[2].strip(),
            'time': item[3].strip(),
        }
        print(dic)

if __name__ == '__main__':
    regex = r'<dd>.*?<.*?class="board-index.*?>(\d+)</i>.*?title="(.*?)".*?class="movie-item-info".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>'
    pattern1 = re.compile(regex, re.S)
    url_dic = {'https://maoyan.com/board/4?offset=60':pattern1} #pattern1是个

    p = Pool() #没有限制
    res_list = []
    for url,pattern in url_dic.items():
        res = p.apply_async(get_page,args=(url,pattern),callback=parse_page)
        res_list.append(res)
    for i in res_list:
        i.get()
posted on 2020-08-13 18:09  94小渣渣  阅读(82)  评论(0编辑  收藏  举报