python案例单进程与多进程,传参

目录

1.单进程

2.多进程

3、多进程传参

4、多进程变量共享

 5、进程通信队列

6、进程通信字典

7、进程通讯列表

8、多个子进程

9、进程池

10、进程池map

11、多进程爬取肯德基门店信息


1.单进程

import time

def run1():
    print('我是run函数')
    # 当前代码阻塞在这了  卡在这了
    time.sleep(1000)

def run2():
    print('我是run函数')
    # 当前代码阻塞在这了  卡在这了
    time.sleep(1000)
run1()
run2()
print('我是下面的代码')

2.多进程

import time
from multiprocessing import Process

def run1():
    for i in range(500):
        print('我是run1函数')
        # 当前代码阻塞在这了  卡在这了
        time.sleep(1)

def run2():
    for i in range(500):
        print('我是run2函数')
        # 当前代码阻塞在这了  卡在这了
        time.sleep(1)

if __name__ == '__main__':
    t1 = time.time()
    p1 = Process(target=run1)  # 创建子进程p1
    p2 = Process(target=run2)  # 创建子进程p2
    p1.start()  # 开启p1子进程
    p2.start()  # 开启p2子进程
    p1.join()  # 阻塞等待 p1子进程执行完  主进程在等待子进程干活啊
    p2.join()  # 阻塞等待 p2 子进程执行完
    print('主进程')
    time.sleep(1000)
    print('我是下面的代码')
    print(time.time() - t1)

3、多进程传参

from multiprocessing import Process

# def run1(num, name):
def run1(num, name='lucky'):
    for i in range(num):
        print(f'我是{name}函数')
        # 当前代码阻塞在这了  卡在这了

if __name__ == '__main__':
    # 元祖的效率高于列表
    # 注意 传递参数args如果为一个值  则需给逗号,1为run1执行的次数
    Process(target=run1, args=(1,)).start()
    # Process(target=run1, args=[1]).start()
    # Process(target=run1, args=(1, )).start()
    # Process(target=run1, args=(1, 'lucky')).start()
    
    # 如果传递参数args为一个值,且没加逗号,将报下面错误
    # TypeError: 'int' object is not iterable

    # for i in 1:
    #     pass
    # TypeError: 'int' object is not iterable

4、多进程变量共享

"""
num = 1
def run1():
    # 声明num为全局变量
    global num
    num = 2  # 更改全局变量num的值为2
    print('我是run1函数', num)

run1()
print(num)
# 输出:我是run1函数 2
# 2
"""

List = []
def run1():
    List.append('luckyboy')
    print('我是run1函数', List)

run1()
print(List)
# 输出:我是run1函数 ['luckyboy']
# ['luckyboy']
from multiprocessing import Process

num = 1
def run1():
    # 声明num为全局变量
    global num
    num = 2  # 更改全局变量num的值为2
    print('我是run1函数', num)


if __name__ == '__main__':
    Process(target=run1).start()
    print('over')
    print(num)  # 1  进程间是独立的  每个进程有自己的独立存储

 5、进程通信队列

from multiprocessing import Process, Queue

def run(que):
    # 将数据放进队列中
    print('子进程放数据')
    que.put(1)
    que.put(2)
    que.put(3)

if __name__ == '__main__':
    # 创建队列对象
    que = Queue()
    # 这里传参args的参数que给run
    p = Process(target=run, args=(que, ))
    p.start()
    p.join()
    print('主进程获取数据', que.get())
    print('主进程获取数据', que.get())
    print('主进程获取数据', que.get())
    # 如果队列中没有数据了  会阻塞等待
    # print('主进程获取数据', que.get())
    # 如果在timeout时间内 还没有数据 跑出异常
    # print('主进程获取数据', que.get(timeout=3))
    
# 输出:子进程放数据
# 主进程获取数据 1
# 主进程获取数据 2
# 主进程获取数据 3

6、进程通信字典

from multiprocessing import Process, Queue, Manager

def run(Dict):
    # 将数据放进队列中
    print('子进程放数据')
    Dict['name'] = 'luckyboy'
    Dict['age'] = '18'

if __name__ == '__main__':
    # 创建队列对象
    Dict = Manager().dict()
    p = Process(target=run, args=(Dict, ))
    p.start()
    p.join()
    print('主进程获取数据', Dict)
# 输出:子进程放数据
# 主进程获取数据 {'name': 'luckyboy', 'age': '18'}

7、进程通讯列表

from multiprocessing import Process, Manager

def run(List):
    # 将数据放进队列中
    print('子进程放数据')
    List.append('luckyboy')
    List.append(18)

if __name__ == '__main__':
    # 创建队列对象
    List = Manager().list()
    p = Process(target=run, args=(List, ))
    p.start()
    p.join()
    print('主进程获取数据', List)
# 输出:子进程放数据
# 主进程获取数据 ['luckyboy', 18]

8、多个子进程

import time
from multiprocessing import Process

def get_data(url):
    # 请求爬取数据
    # requests.get(url)
    # print(new_url)
    print(url)
    time.sleep(1)

if __name__ == '__main__':
    # 爬取10页数据
    url = 'http://www.baidu.com?page='
    start = time.time()
    # print('开始时间:' , start)
    for i in range(10):
        new_url = url + str(i)
        Process(target=get_data, args=(new_url,)).start()
# 输出:http://www.baidu.com?page=0
# http://www.baidu.com?page=1
# http://www.baidu.com?page=2
# http://www.baidu.com?page=3
# http://www.baidu.com?page=4
# http://www.baidu.com?page=5
# http://www.baidu.com?page=6
# http://www.baidu.com?page=7
# http://www.baidu.com?page=8
# http://www.baidu.com?page=9

9、进程池

import time
from multiprocessing import Pool, cpu_count

def get_data(url):
    # 请求爬取数据
    # requests.get(url)
    # print(new_url)
    print('子进程开始', url)
    time.sleep(10)
    print('子进程结束', url)

if __name__ == '__main__':
    # 爬取10页数据
    # 注意
    # 自己练习抓取数据的时候 别给好几个进程  容易给网站跑死
    url = 'http://www.baidu.com?page='
    # pool = Pool()  # 传参 开启几个进程  默认开启核心数个cpu
    pool = Pool(2)  # 传参2 开启2个进程  默认开启核心数个cpu
    for i in range(6):
        url = 'http://www.baidu.com?page='+str(i)
        # 任务添加到进程池
        pool.apply_async(get_data, args=(url, ))
    pool.close()  # 关闭池子 不在放进程了
    pool.join()  # 阻塞等待
    print('主进程结束')
    print(cpu_count()) # 打印电脑的核心数
# 输出:
# 子进程开始 http://www.baidu.com?page=0
# 子进程开始 http://www.baidu.com?page=1
# 子进程结束 http://www.baidu.com?page=0
# 子进程开始 http://www.baidu.com?page=2
# 子进程结束 http://www.baidu.com?page=1
# 子进程开始 http://www.baidu.com?page=3
# 子进程结束 http://www.baidu.com?page=2
# 子进程开始 http://www.baidu.com?page=4
# 子进程结束 http://www.baidu.com?page=3
# 子进程开始 http://www.baidu.com?page=5
# 子进程结束 http://www.baidu.com?page=4
# 子进程结束 http://www.baidu.com?page=5
# 主进程结束
# 4

10、进程池map

import time
from multiprocessing import Pool, cpu_count

def get_data(url):
    # 请求爬取数据
    # requests.get(url)
    # print(new_url)
    print('子进程开始', url)
    time.sleep(10)
    print('子进程结束', url)

if __name__ == '__main__':
    # 爬取10页数据
    # 注意
    # 自己练习抓取数据的时候 别给好几个进程  容易给网站跑死
    url = 'http://www.baidu.com?page='
    # pool = Pool()  # 传参 开启几个进程  默认开启核心数个cpu
    pool = Pool(3)  # 传参 开启几个进程  默认开启核心数个cpu
    url_list = []
    for i in range(5):
        url = 'http://www.baidu.com?page='+str(i)
        url_list.append(url)
    pool.map(get_data, url_list)

# 输出:
# 子进程开始 http://www.baidu.com?page=0
# 子进程开始 http://www.baidu.com?page=1
# 子进程开始 http://www.baidu.com?page=2
# 子进程结束 http://www.baidu.com?page=0
# 子进程开始 http://www.baidu.com?page=3
# 子进程结束 http://www.baidu.com?page=1
# 子进程开始 http://www.baidu.com?page=4
# 子进程结束 http://www.baidu.com?page=2
# 子进程结束 http://www.baidu.com?page=3
# 子进程结束 http://www.baidu.com?page=4

11、多进程爬取肯德基门店信息

import urllib.request
import urllib.parse
import json
from  multiprocessing import Process

def kfc(num):
    # 拿到地址
    url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    headers = {
        'User-Agent':' Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
    }
    print(f'第{num}页数据')
    # 获取到当前浏览器请求所携带的表单数据
    formData = {
        'cname': '',
        'pid': '',
        'keyword': '北京',
        'pageIndex': num,
        'pageSize': 10,
    }
    # 对表单数据进行转码
    formData = urllib.parse.urlencode(formData).encode('UTF-8')
    # 发送post请求
    request = urllib.request.Request(url, data=formData, headers=headers)
    response = urllib.request.urlopen(request)
    # 返回json数据 转换成字典
    data = json.loads(response.read().decode('UTF-8'))
    # print(data['Table1'])
    for l in data['Table1']:
        print(l)

if __name__ == '__main__':
    for i in  range(1, 10):
        Process(target=kfc, args=(i,)).start()

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值