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()}