python爬虫十:多任务进程

1、进程介绍

进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。

import multiprocessing
import time
def demo1():
    while True:
        print('我是进程1....')
        time.sleep(1)
def demo2():
    while True:
        print('我是进程2....')
        time.sleep(1)
def main():
    t1 = multiprocessing.Process(target=demo1)
    t2 = multiprocessing.Process(target=demo2)
    t1.start()
    t2.start()
if __name__ == '__main__':
    main()

2、线程和进程之间的对比

进程:能够完成多任务,一台电脑上可以同时运行多个QQ
线程:能够完成多任务,一个QQ中的多个聊天窗口
根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

3、进程之间的通信

Queue-队列 先进先出from multiprocessing import Queue
共享全局变量不适用于多进程编程

import multiprocessing
from queue import Queue
import time

def download(q):
    q.put('abc')
    q.put('1')
    q.put('2')
    q.put('3')
def parse_data(q):
    time.sleep(2)
    q.get()
def main():
    q = multiprocessing.Queue()
    # q = Queue()
    p1 = multiprocessing.Process(target=download,args=(q,))
    p2 = multiprocessing.Process(target=parse_data,args=(q,))
    p1.start()
    time.sleep(2)
    p2.start()


if __name__ == '__main__':
    main()

import multiprocessing

a = 1
def demo1():
    global a
    a += 1
def demo2():
    print(a)

if __name__ == '__main__':
    p1 = multiprocessing.Process(target=demo1)
    p2 = multiprocessing.Process(target=demo2)
    p1.start()
    p2.start()

4、进程池之间的通信

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程,但是如果是上百甚至上千个目标,手动的去创建的进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法

# from multiprocessing import Pool
# import time,os,random
# def worker(msg):
#     t_start = time.time()
#     print('%s开始执行,进程号为%d' % (msg, os.getpid()))
#
#     time.sleep(random.random() * 2)
#     t_stop = time.time()
#     print(msg, "执行完成,耗时%0.2f" % (t_stop - t_start))
# if __name__ == '__main__':
#     po = Pool(4)  # 定义一个进程池
#     for i in range(0,20):
#         po.apply_async(worker, (i,))
#
#     print("--start--")
#     po.close() # 一旦池子满了 关闭
#     po.join()
import multiprocessing
def demo1(q):
    q.put(1)
    q.put(2)
    q.put(3)
def demo2(q):
    print(q.get())
    print(q.get())
    print(q.get())
if __name__ == '__main__':
    q = multiprocessing.Manager().Queue()
    po = multiprocessing.Pool(2)
    po.apply_async(demo1,args=(q,))
    po.apply_async(demo2,args=(q,))
    po.close()
    po.join()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值