Python 中进程的知识点

1.什么是进程(process)和什么是线程(thread)

    a.进程是操作系统分配资源的最小单元,而线程是操作系统调度的最小单元

    b.一个应用程序最少包含1个进程,而一个进程包含一个或者多个线程,线程尺度更小

    c.每个线程在执行过程中拥有独立的内存单元,而一个进程的多个线程在执行过程中共享内存

2.开始写一个带process的function

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os 
from multiprocessing import Process
def task(name):
    print 'child process'
    print name
    print os.getpid()

if __name__=='__main__':
    print '-------'
    p = Process(target = task, args=('test',))
    p.start()
    p.join()
    print 'process end'

3.写一个带process的class:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import multiprocessing
import os 
from multiprocessing import current_process
class Work(multiprocessing.Process):
    def run(delf):
        name = current_process().name
        print name,os.getpid()
        print delf.name
        return 

        

if __name__=='__main__':
    print '-------',os.getpid()
    p = Work()
    p.start()
    p.join()
    print 'process end'

4.启动多个进程

import multiprocessing
import os
def worker(num):
  print 'Worker:', num+1 , os.getpid()
  return
if __name__ == '__main__':
  jobs = []
  for i in range(5):
    p = multiprocessing.Process(target=worker, args=(i,))
    jobs.append(p)
    p.start()#启动进程

5.进程中关于terminate()结束子进程,但是会导致子进程的资源无法释放掉,是不推荐的做法,因为结束的时候不清楚子线程的运行状况,有很大可能性导致子线程在不恰当的时刻被结束。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import multiprocessing
import time
import os
def worker():
    print 'ddddddd starting'
    time.sleep(1)
    print 'finsh'
#terminate()结束子进程,但是会导致子进程的资源无法释放掉

if __name__=='__main__':
    p = multiprocessing.Process(target = worker)
    print 'zhixingqian',p.is_alive()
    p.start()
    print 'zhong',p.is_alive()
    p.terminate()#发送停止信号
    print 'ting',p.is_alive()
    p.join()
    print 'end',p.is_alive()

6.多进程的启动

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
import random
import time
from multiprocessing import Pool, current_process
from time import ctime
def task(name):
  print 'start task' ,name, os.getpid()
  start = time.time()
  time.sleep(random.random() * 3)
  print 'end task ' ,name, (time.time() - start)
  return current_process().name + 'done'
if __name__ == '__main__':
  print 'parent process',os.getpid() 
  result = []
  p = Pool() # 初始化进程池
  for i in range(5):
    result.append(p.apply_async(task, args=(i,))) # 追加任务 apply_async 是异步非阻塞的,就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。
  p.close()
  p.join() # 等待所有结果执行完毕
  for res in result:
    print res.get() # get()函数得出每个返回结果的值
  print 'all done at:', {ctime()}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章