进程相关

Posted chenxi67

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程相关相关的知识,希望对你有一定的参考价值。

一.进程和线程的区别 或者GIL锁

  1.进程是cpu资源分配的最小单元

   线程是cpu计算的最小单元

  2.一个进程中可以有多个线程

  3.对于python来说他的进程和线程和其他语言有差异, 是有GIL锁.

   GIL锁保证一个进程中同一时刻只有一个线程被cpu调度.

  IO密集型操作可以使用多线程, 计算密集型操作可以使用多进程.

二.进程

  进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

  操作系统引入进程的概念的原因

从理论角度看,是对正在运行的程序过程的抽象;

从实现角度看,是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。

 进程的特征
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
 进程与程序的区别
程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
程序可以作为一种软件资料长期存在,而进程是有一定生命期的。
程序是永久的,进程是暂时的。

  进程间的数据不共享

1.进程间的通信应该尽量避免共享数据的方式

2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的。虽然进程间数据独立,但可以用过Manager实现数据共享

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 = threading.Thread(target=task,args=(i,))
        p.start()
if __name__ == __main__:
    run()
#结果
  [2]
  [0]
  [1]
  [3]
  [8]
  [5]
  [6]
  [7]
  [4]
  [9]

进程的常用功能

  join 

  deamon

  name

  multiprocessing.current_process()

  multiprocessing.current_process().ident/pid

import time
import multiprocessing
def task(arg):
    p = multiprocessing.current_process()
    print(p.name)
    time.sleep(2)
    print(arg)
def run():
    print(111111111)
    p1 = multiprocessing.Process(target=task,args=(1,))
    p1.name = pp1
    p1.start()
    print(222222222)
    p2 = multiprocessing.Process(target=task, args=(2,))
    p2.name = pp2
    p2.start()
    print(333333333)
if __name__ == __main__:
    run()
#结果:111111111
     222222222
   333333333
   pp1
   pp2
   1
   2    

通过类继承方式创建进程

import multiprocessing
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-1, started)>
     当前进程 <MyProcess(MyProcess-2, started)>

进程间的数据共享

  进程之间的通信有两种实现方式:管道和队列


from multiprocessing import Manager,Process,Lock
def work(dic,mutex):
    # mutex.acquire()
    # dic[‘count‘]-=1
    # mutex.release()
    # 也可以这样加锁
   with mutex:
        dic[count] -= 1
if __name__ == __main__:
    mutex = Lock()
    m = Manager()  #实现共享,由于字典是共享的字典,所以得加个锁
    share_dic = m.dict({count:100})
    p_l = []
    for i in range(100):
        p = Process(target=work,args=(share_dic,mutex))
        p_l.append(p)  #先添加进去
        p.start()
    for i in p_l:
        i.join()
    print(share_dic)
 # 共享就意味着会有竞争,

三.进程锁

  Lock

  RLock

  

import time
import threading
import multiprocessing
lock = multiprocessing.RLock()
def task(arg):
    print(鬼子来了)
    lock.acquire()
    time.sleep(2)
    print(arg)
    lock.release()
if __name__ == __main__:
    p1 = multiprocessing.Process(target=task, args=(1,))
    p1.start()
    p2 = multiprocessing.Process(target=task, args=(2,))
    p2.start()

为什么要加锁

  因数据共享

四.进程池

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。多进程是实现并发的手段之一,需要注意的问题是:

  1. 很明显需要并发执行的任务通常要远大于核数
  2. 一个操作系统不可能无限开启进程,通常有几个核就开几个进程
  3. 进程开启过多,效率反而会下降(开启进程是需要占用系统资源的,而且开启多余核数目的进程也无法做到并行)

那么什么是进程池呢?  进程池就是控制进程数目

创建进程池的类:如果指定numprocess为3,则进程池会从无到有创建三个进程,然后自始至终使用这三个进程去执行所有任务,不会开启其他进程

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

五.初始爬虫

  1.安装:

    pip3 install requests

    pip3 install beautifulsoup4

技术分享图片 示例

 相关:

  a.以上示例进程和线程哪个好?
    线程好

  b.requests 模块模拟浏览器发送请求

    本质 requests.get():

      创建socket客户端

      连接 (阻塞)

      发送请求

      接收请求 (阻塞)

      断开连接

  c.线程和进程池












以上是关于进程相关的主要内容,如果未能解决你的问题,请参考以下文章

代码片段:Shell脚本实现重复执行和多进程

Shell外壳的简易模拟

LINUX PID 1和SYSTEMD PID 0 是内核的一部分,主要用于内进换页,内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程(代码片段

AJAX相关JS代码片段和部分浏览器模型

Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段

解释器在解析JavaScript代码时对于这两种方式