Python Process 多进程 multiprocessing

时间:2022-05-28 04:10:29

《Python 多线程》  可以跟这篇文章进行比较

 

from multiprocessing import Process


import time


def work(x, n):
    print(x)
    time.sleep(2)
    print(n)

def otherWork(x, n):
    print(x)
    time.sleep(2)
    print(n)

if __name__ == '__main__':
    p = Process(target=work, args=("Hello world", 1))
    p.start()

    p1 = Process(target=otherWork, args=("Hello world", 2))
    p1.start()

 

 

输出:

Hello world
Hello world
1
2

在主进程中的p.join()函数,如果加上join的话就是先让一个进程执行完了之后,然后在执行新的进程,这时候就会阻塞这这里,如果没有这个join的话,这几个进程的输出的同时的。

进程和线程的区别

一个进程中的各个线程与主进程共享相同的资源,与进程间互相独立相比,线程之间信息共享和通信更加容易(都在进程中,并且共享内存等)。

线程一般以并发执行,正是由于这种并发和数据共享机制,使多任务间的协作成为可能。

进程一般以并行执行,这种并行能使得程序能同时在多个CPU上运行;

区别于多个线程只能在进程申请到的的“时间片”内运行(一个CPU内的进程,启动了多个线程,线程调度共享这个进程的可执行时间片),进程可以真正实现程序的“同时”运行(多个CPU同时运行)。

一般来说,在Python中编写并发程序的经验:

计算密集型任务使用多进程 IO密集型(如:网络通讯)任务使用多线程,较少使用多进程。这是由于 IO操作需要独占资源,比如:网络通讯(微观上每次只有一个人说话,宏观上看起来像同时聊天)每次只能有一个人说话文件读写同时只能有一个程序操作(如果两个程序同时给同一个文件写入 ‘a’, ‘b’,那么到底写入文件的哪个呢?) 都需要控制资源每次只能有一个程序在使用,在多线程中,由主进程申请IO资源,多线程逐个执行,哪怕抢占了,也是逐个运行,感觉上“多线程”并发执行了。 如果多进程,除非一个进程结束,否则另外一个完全不能用,显然多进程就“浪费”资源了。

1、进程和线程的区别?
解析:(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
          (2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
          (3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
          (4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
          (5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
          (6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
2、死锁?死锁产生的原因?死锁的必要条件?怎么处理死锁?
解析:(--)相互等待资源而产生的一种僵持状态,如果没有外力的干预将一直持续这个状态
          (--)系统资源不足、相互竞争资源、请求资源顺序不当
          (2)互斥、不可抢占、循环等待、请求与保持
          (3)因为互斥是不可改变的,所以只能破坏其他三个条件中的一个来解除死锁,方法:剥夺资源、杀死其中一个线程
3、Windows内存管理方式:段存储、页存储、段页存储
解析:
4、进程的几种状态?
解析:(1)run(运行状态):正在运行的进程或在等待队列中对待的进程,等待的进程只要以得到cpu就可以运行
          (2)Sleep(可中断休眠状态):相当于阻塞或在等待的状态
          (3)D(不可中断休眠状态):在磁盘上的进程
          (4)T(停止状态):这中状态无法直观的看见,因为是进程停止后就释放了资源,所以不会留在linux中
          (5)Z(僵尸状态):子进程先与父进程结束,但父进程没有调用wait或waitpid来回收子进程的资源,所以子进程就成了僵尸进程,如果父进程结束后任然没有回收子进程的资源,那么1号进程将回收

线程和进程各自有什么区别和优劣呢?

  • 进程是资源分配的最小单位,线程是程序执行的最小单位。
  • 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
  • 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  • 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

 

 

 

 

http://www.codeblogbt.com/archives/65100