python-进程
一、进程
from multiprocessing import Process
process = Process(target = 函数,name = 进程的名字,args = (给函数传递的参数))
对象调用方法:
- proce.start() —> 启动进程并执行任务
- process.run() —> 只是执行了任务但是没有启动进程
- terminate() —> 终止
进程池
Pool = Pool(max)
创建进程池对象
1、非阻塞式
全部添加到队列中,立刻返回
pool.apply_async() ----> 非阻塞的
pool.close()
pool.join() ----> 让主进程让步
举例
from multiprocessing import Pool
import time
from random import random
import os
def task(task_name):
print('开始做任务:',task_name)
start = time.time()
time.sleep(random()*2)
end = time.time()
print('完成任务',task_name,'用时:',(end - start),'任务进程id:',os.getid())
container = []
def callback_func():
print(n)
if __name__=='__main__':
pool = Pool(5)
tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','做饭']
for task1 in tasks:
pool.apply_async(task,args=(task1,),callback=callback_func)
pool.close()
pool.join()
print('over!')
2、阻塞式
添加一个执行一个任务,如果一个任务不结束,另一个任务就进不来
pool.apply() ----> 阻塞的
线程
1、 创建线程
法一:
t = Thread(target = func,name = '',args = (),kwargs = {})
t.start() ----> 就绪状态
run()
join()
法二: 自定义线程
class MyThread(Thread):
def __init__(self,name):
super().__init__()
self.name = name
def run(self):
任务
t = MyThread('name')
t.start()
2、数据共享
进程共享数据与线程共享数据区别:
- 进程是每个进程中都有一份
- 线程是共同一个数据 ----> 数据安全性问题
lock = Lock()
lock.acqure()
......
lock.release()
----> 只要用锁:死锁(避免)
3、进程间通信:生产者与消费者
生产者:线程
消费者:线程
import queue
from multiprocessing import put
q = queue.Queue()
----> 创建生产者
th = threading.Thread(target = produce,args = (q,))
th.start()
----> 创建消费者
tc = threading.Thread(target = consume,args = (q,))
tc.start()
q.put()
q.get()
q = Queue(5)
q.put('A')
put()如果queue满了则只能等待,除非有“空地”则添加成功
if not q.full():
q.put('F',timeout=3)
else:
print('队列已满!')