• 进程


    什么是进程

    进程是线程的容器,程序是指令,数据及其组织形式的描述,进程是程序的实体.

    第一:进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text reqion),数据区域(data reqion)和堆栈(stack reqion).文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储区域储存着活动过程调用的指令和本地变量
    
    第二:进程是一个"执行中的程序".程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我称其为进程
    
    进程是操作系统中最基本,重要的概念.是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上.
    进程的概念
    从理论角度看,是对正在运行的程序的抽象;
    从实现角度看,是一种数据结构,目的在于清晰的刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序.
    操作系统引入进程的概念的原因
    动态性:进程的实质是程序在多道系统中的一次执行过程,进程是动态产生,动态消亡的
    并发性:任何进程都可以同其他进程一起并发执行
    独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位
    异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的,不可预知的速度向前推进
    
    结构特征:进程由程序,数据和进程控制块三部分组成
    
    多个不同的进程可以包含相同的程序:一个程序在不同的数据集合里就构成不同的进程,能得到不同的结果,但是执行过程中,程序不能发生改变.
    进程的特征
    程序是指令和数据的有序集合,其本身没有任何的含义,是一个静态的概念
    
    而进程是程序在处理机上的一次执行过程,它是一个动态的概念.
    程序可以作为一种软件资料长期存在,而进程是有一定生命期的,
    程序是永久的,进程是暂时的
    进程于程序中的区别

    同一个程序执行两次,就会在操作系统中出现两个进程,所以我们可以同时运行一个软件,分别做不同的事情也不会混乱.

    进程间的数据不共享;

    import multiprocessing
    
    data_list = []
    
    def task(arg):
    
      data_list.append(arg)
    
      print(data_list)
    
    def run():
        for i in range(10):
            p = multiprocessing.Process(target = task,args =(i,))
            p.start()
    
    if __name__ == '__main__':
        run()

    进程常用功能:

    import time
    def task(arg):
        time.sleep(2)
        print(arg)
    
    def run():
        print('11111')
        p1 = multiprocessing.Process(target=task,args = (i,))
        p1.name = 'pp1'
        p1.start()
        print('22222')
    
        p2 = multiprocessing.Process(target=task,args = (i,))
        p2.name = 'pp2'
        p2.start()
        print('33333')
    
    if __name__ = '__main__':
        run()

    通过继承方式创建进程:

    class MyProcess(multiprocessing.Process):
        def run(self):
            print('当前进程',multiprocessing.current_process())
    
    def run():
        p1 = MyProcess()
        p1.start()
        
        p2 = MyProcess()
        p2.start()
    
    if __name__ == '__main__':
        run()
    
    
    #当前进程 <MyProcess(MyProcess-2, started)>
    #当前进程 <MyProcess(MyProcess-1, started)>

    进程间数据共享:

    def task(arg,q):
        q.put(arg)
    
    if __name__ =='__main__':
        q = multiprocessing.Queue()
        for i in range(10):
            p = multiprocessing.Process(target = task,args=(i,))
            p.start()
    
        while True:
            v = q.get()
            print(v)
    Queue
    def task(arg,dic):
        time.sleep(2)
        dic[arg] = 100
    
    if __name__ == '__main__':
        m = multiprocessing.Manger()
    
        process_list = []
        for i in range(10):
    
            p = multiprocessing.Process(target = task,args = (i,))
            p.start()
    
            process_list.append(p)
        while True:
            count = 0
            for p in process_list:
                if not p.is_alive():
                    count += 1
            if count == len(process_list):
                break
        print(dic)
    Manager

    进程锁:(与线程锁相同的用法)

    #加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。
    虽然可以用文件共享数据实现进程间通信,但问题是:
    1.效率低(共享数据基于文件,而文件是硬盘上的数据)
    2.需要自己加锁处理
    
    #因此我们最好找寻一种解决方案能够兼顾:1、效率高(多个进程共享一块内存的数据)2、帮我们处理好锁问题。这就是mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道。
    队列和管道都是将数据存放于内存中
    队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,
    我们应该尽量避免使用共享数据,尽可能使用消息传递和队列,避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。
    import time
    import multiprocessing  #引入进程模块
    
    lock = multiprocessing.Rlock()
    
    def task(arg):
        print(">>>")
        lock.acquire()  #加锁
        time.sleep(2)
        print(arg)
        lock.release()   #解锁

    进程池:

    import time
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    
    def task(ark):
        time.sleep(2)
        print(arg)
    
    if __name__ =='__main__':
        pool = ProcessPoolExecutor(5)
        for i in range(10):
            pool.submit(task,i)

    初始爬虫:

    (安装: pip3 install requests / pip3 install beautifulsoup4)

    import requests
    from bs4 import BeautifulSoup
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    
    #模拟浏览器发送请求
    #内部创建 sk = socket.socket()
    #和抽屉进行socket连接 sk.connect(...)
    #sk.sendall('...')
    #sk.recv('...')
    
    
    def task(url):
        print(url)
        r1 = requests.get(
                url = url,
                headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'})
    # 查看下载下来的文本信息
        soup = BeautifulSoup(r1.text,'html.parser')
        print(soup.text)
        # content_list = soup.find('div',attrs={'id':'content-list'})
        # for item in content_list.find_all('div',attrs={'class':'item'}):
        #     title = item.find('a').text.strip()
        #     target_url = item.find('a').get('href')
        #     print(title,target_url)
    
    def run():
        pool = ThreadPoolExecutor(5)
        for i in range(1,50):
            pool.submit(task,'https://dig.chouti.com/all/hot/recent/%s' %i)
    
    
    if __name__ == '__main__':
        run()                    
    初识爬虫
  • 相关阅读:
    [Vue warn]: Avoid mutating a prop directly since the value will be overwritten
    修改git地址
    Clipboard使用
    Electron as GUI of Python
    VUE AXIOS封装三
    Vue-Cli3/Webpack / i18n / image / CDN vue项目优化总结
    echarts 折线图点击高亮
    vue中 左侧导航条 多个toggleClass
    js中异常处理
    Element UI disableddate设置动态时间,结束日期不可大于开始日期以及时间点
  • 原文地址:https://www.cnblogs.com/wangjun187197/p/9636857.html
Copyright © 2020-2023  润新知