进程线程day1

Posted

tags:

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

 

程序:就是一段代码,么有执行

进程:以进程为单位来分配系统资源的最小单位,也就是把一段程序执行起来,操作系统会分配一个内存空间,

  里面有代码,有变量,还有程序执行到哪里的计数器等,这就是进程

单核cpu:如何同时运行qq,微信,酷狗,等多任务?

    这是运用的分时复用的原理,有一个时间片的概念,他是微秒级的,1000微秒=1毫秒,1000毫秒=1秒,

    也就是在一定的时间之内cpu通过时间片来回的切转,让我们人眼看起来就是同时在运行。

1.继承模块中的Process类

from multiprocessing import Process
import os

def run(num):
  print os.getpid(),os.getppid()
  print num

创建一个子进程对象
process = Process(target=run, args=(100,), kwargs={})

process.start()
process.join()

 

2、通过继承Process类来创建进程类,可以重新写一些方法,可以初始化一些参数,以便使用

from multiprocessing import Process

from os import getpid


class SubProcess(Process):
  def __init__(self, num):
    super(SubProcess, self).__init__()  
    self.num = num

  def run(self):
    print ‘zijincheng‘, getpid()
    self.work()

    self.fun()

  def work(self):
    print ‘haha‘

  def fun():

    pass


process_object = SubProcess(100)

process_object.start()   #会自动开启run方法
process_object.join()

 

3、 执行过程

import os
import time 

from multiprocessing import Process

def sub_process_fun(num, a):

  print os.getpid(),os.getppid()

 

  # process_obj = Process(target=sub_process_fun, args=(100,), kwargs={"a": 10}, name="itcast")
process_obj = Process(target=sub_process_fun, args=(100,), kwargs={"a": 10})

process_obj.start()

print process_obj.name
print process_obj.pid      查看子进程pid
print process_obj.is_alive()

process_obj.join()         回收子进程,默认是阻塞的

process_obj.terminate()    停止了子进程,只是停止代码,但是没有进行资源回收,所以下一行is_alive 返回值是true
print("父进程:子进程的状态 %s" % process_obj.is_alive())
print("父进程: 回收子进程的资源")

 


 

4、什么是进程池呢?

 

  当一个主进程执行过程中需要创建子进程来完成多个任务时候,那么如果运用fork来进行创建然后再回收,

 

    在创建在回收,降低主进程性能。所以事先创建进程池。

 

  当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,

    手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法

 

from multiprocessing import Pool
import os

 

def work():
  print os.getpid()
  print os.getppid()

 

po = Pool(3)
for i in range(3):
  po.apply_async(work,())    后面一个参数是元组形式,(i,)

#非阻塞方式,就是当执行到这里,主进程for循环执行完了以后
# 不管子进程是否执行,那么还会继续执行下面的代码
#apply()阻塞方式

 

#关闭进程池,但资源并没有释放
po.close()
# 回收进程池资源 主进程阻塞
po.join()

 

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

进程与线程的区别

进程与线程的区别

线程与进程

进程与线程的问题

进程线程

linux内核——进程,轻量级进程,线程,线程组