Python进程简介
进程三种状态
- 就绪:已获得运行所需资源,除了cpu资源。
- 阻塞:等待cpu以外的其他资源
- 执行→阻塞:执行的进程发生等待事件而无法执行变为阻塞状态。例如IO请求,申请资源得不到满足。
- 阻塞→就绪:处于阻塞状态在其等待的事件已经发生,并不马上转入执行状态,先转入就绪状态
- 执行→就绪:时间片用完而被暂停执行。
- 临界区:一次只允许一个进程进入访问的一段代码。临界区保护原则是有空让进,有限等待。
multiprocessing模块提供了一个process类来代表一个进程对象,这个模块表示像线程一样管理进程,这个是multiprocessing的核心,它与threading相似,对多核的CPU的利用率会比threading更好。
对于multiprocessing中的process类的构造方法如下:
_init_(self, group=None, target=None, name=None, args=(), kwargs={
})
参数说明:
- group:进程所属组。(一般为缺省)
- target:表示调用对象。
- args:表示调用对象的位置参数元组。
- name:别名
- kwarges:表示调用对象的字典。
启动多进程
from multiprocessing import Process
from time import sleep
import os
def task1():
while True:
sleep(1)
print('这是任务1',os.getpid(),'---',os.getppid())
def task2():
while True:
sleep(1)
print('这是任务2',os.getpid(),'---',os.getppid())
if __name__ == '__main__':
p = Process(target=task1, name='任务1')
p.start()
print(p.name)
p1 = Process(target=task2, name='任务2')
p1.start()
print(p1.name)
print('***************************')
主进程控制字进程启停
from multiprocessing import Process
from time import sleep
import os
def task1(s):
while True:
sleep(s)
print('这是任务1', os.getpid(), '---', os.getppid())
def task2(s):
while True:
sleep(s)
print('这是任务2', os.getpid(), '---', os.getppid())
number = 1
if __name__ == '__main__':
p = Process(target=task1, name='任务1', args=(1,))
p.start()
print(p.name)
p1 = Process(target=task2, name='任务2', args=(2,))
p1.start()
print(p1.name)
print('***************************')
while True:
number += 1
sleep(0.2)
if number == 100:
p.terminate()
p1.terminate()
break
else:
print('-------number', number)
一般情况下不能共享全局变量
进程间的通信应该尽量避免共享数据的方式
进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的。
from multiprocessing import Process
from time import sleep
import os
m = 1 # 共享全局变量
list1 = []
def task1(s):
global m
while True:
sleep(s)
m += 1
list1.append(str(m) + 'task1')
print('这是任务1', m, list1)
def task2(s):
global m
while True:
sleep(s)
m += 1
list1.append(str(m) + 'task2')
print('这是任务2', m, list1)
number = 1
if __name__ == '__main__':
p = Process(target=task1, name='任务1', args=(1,))
p.start()
print(p.name)
p1 = Process(target