python_进程

import time
import multiprocessing
# process = Process(target =函数,name = 进程的名字,args=(给函数传递的参数))
# process 对象
# 对象的调用方法:
# process.start() 启动进程并执行任务
# process.run 只是执行了任务但没有启动进程
# terminate 终止

#进程创建
import os
def task1(s):
    while True:
        time.sleep(s)
        print('task 1',os.getpid(),os.getppid()) #pid 当前进程号,ppid当前父进程号

def task2(s,name):
    while True:
        time.sleep(s) # args=(s,)
        print('task 2',os.getpid(),os.getppid(),name) # args='aa'


number =1
if __name__ == '__main__':
    #test.py 为父进程
    # 子进程
    p1 = multiprocessing.Process(target=task1,name='任务1',args=(1,)) # target=函数名,不加(),若加()传递的是函数调用后的结果
    p1.start()
    print(p1.name)
    p2 = multiprocessing.Process(target=task2,name='任务2',args=(1,'aa'))# Process 生成进程, name 为当前进程的名字,#args= 作为参数传入上头s及name
    p2.start()
    print(p2.name)

    while True:
        number += 1
        time.sleep(0.1)
        if number ==100:
            p1.terminate()
            p2.terminate()
            break
        else:
            print(number)
import time
import multiprocessing

#进程创建

m =1
# 对于进程中的全局变量,不共享
def task1(s):
    global m
    while True:
        time.sleep(s)
        m += 1
        print('task 1',m)

def task2(s):
    global m
    while True:
        time.sleep(s)
        m += 1
        print('task 2',m)



if __name__ == '__main__':
    #test.py 为父进程
    # 子进程
    p1 = multiprocessing.Process(target=task1,name='任务1',args=(1,))
    p1.start()

    p2 = multiprocessing.Process(target=task2,name='任务2',args=(2,))
    # Process 生成进程, name 为当前进程的名字,#args= 作为参数传入上头s及name
    p2.start()


    while True:
        time.sleep(3)
        m +=1
        print('main:',m)
----------------------------------------------------
task 1 2
task 1 3task 2
 2
main: 2
task 1 4
task 2 3
task 1 5
task 1 6
main: 3
task 2 4
task 1 7
task 1 8
import time
import multiprocessing
# process = Process(target =函数,name = 进程的名字,args=(给函数传递的参数))
# process 对象
# 对象的调用方法:
# process.start() 启动进程并执行任务
# process.run 只是执行了任务但没有启动进程
# terminate 终止

#进程创建
import os
def task1(s):
    while True:
        time.sleep(s)
        print('task 1',os.getpid(),os.getppid()) #pid 当前进程号,ppid当前父进程号

def task2(s,name):
    while True:
        time.sleep(s) # args=(s,)
        print('task 2',os.getpid(),os.getppid(),name) # args='aa'


number =1
if __name__ == '__main__':
    #test.py 为父进程
    # 子进程
    p1 = multiprocessing.Process(target=task1,name='任务1',args=(1,))
    p1.start()
    print(p1.name)
    p2 = multiprocessing.Process(target=task2,name='任务2',args=(1,'aa'))# Process 生成进程, name 为当前进程的名字,#args= 作为参数传入上头s及name
    p2.start()
    print(p2.name)

    while True:
        number += 1
        time.sleep(0.1)
        if number ==100:
            p1.terminate()
            p2.terminate()
            break
        else:
            print(number)
-----------------------------------------------
任务1
任务2
2
3
4
5
6
7
8
9
10
task 2 34204 25548 aa
task 1 31716 25548
11
12
13
14
15
16
17
18
19
task 2 34204 25548 aa
task 1 31716 25548
20
21
22
23
24
25
26
27
28
task 2 34204 25548 aa
task 1 31716 25548
29
30
31


进程池:

        当需要创建的子进程数量不多,可以使用multiprocessing中的Process动态生成多个进程,但是目标多时,则利用Pool方法。

        初始化Pool时,可以指定一个最大进程数,当有新的请求到pool时,如果池没满,则会创建一个新的进程来响应请求,如果池已经达到指定最大值,请求就会等待,直到池中有其他进结束,才会执行。

进程池:

        pool = Pool(max)创建进程池对象

        pool.apply()阻塞

        pool.apply_async()非阻塞

        pool.close()停止添加

        pool.join 让主进程让步

        

非阻塞式:

import  multiprocessing,time,os
from random import random

def task(taskname):
    print('开始任务',taskname)
    start = time.time()
    #使用sleep
    time.sleep(random()*2) # 随机停歇一段时间
    end = time.time()
    print('结束任务',taskname,'时长:',(end - start),'进程id:',os.getpid())


if __name__ == '__main__':
    pool = multiprocessing.Pool(5)
    tasks = ['吃饭','睡觉','打豆豆','听歌','看电影','读书']
    for i in tasks:
        pool.apply_async(task,args=(i,))   # 阻塞式

    #必须添加以下两句,否则直接执行 print('over')
    pool.close() # 添加任务结束
    pool.join()

    print('over')
------------------------------------------------------------------------
开始任务 吃饭
开始任务 睡觉
开始任务 打豆豆
开始任务 听歌
开始任务 看电影
结束任务 睡觉 时长: 1.0555424690246582 进程id: 27916
开始任务 读书
结束任务 打豆豆 时长: 1.1265671253204346 进程id: 23288
结束任务 听歌 时长: 1.1395740509033203 进程id: 34624
结束任务 看电影 时长: 1.324636459350586 进程id: 18152
结束任务 吃饭 时长: 1.4500024318695068 进程id: 29340
结束任务 读书 时长: 1.1366159915924072 进程id: 27916
over
import  multiprocessing,time,os
from random import random

def task(taskname):
    print('开始任务',taskname)
    start = time.time()
    #使用sleep
    time.sleep(random()*2) # 随机停歇一段时间
    end = time.time()
    #print('结束任务',taskname,'时长:',(end - start),'进程id:',os.getpid())
    return '结束任务',taskname,'时长:',(end - start),'进程id:',os.getpid()

container = [] #列表可变,不需调global
def callback_func(n):
    container.append(n)

if __name__ == '__main__':
    pool = multiprocessing.Pool(5)
    tasks = ['吃饭','睡觉','打豆豆','听歌','看电影','读书']

    #非阻塞式
    for i in tasks:
        pool.apply_async(task,args=(i,),callback=callback_func) #callback 回调

    #必须添加以下两句,否则直接执行 print('over')
    pool.close() # 添加任务结束
    pool.join()

    for c in container:
        print(c)


    print('over')
---------------------------------------------------------------------
开始任务 吃饭
开始任务 睡觉
开始任务 打豆豆
开始任务 听歌
开始任务 看电影
开始任务 读书
('结束任务', '睡觉', '时长:', 0.982391357421875, '进程id:', 20936)
('结束任务', '吃饭', '时长:', 1.2418849468231201, '进程id:', 28024)
('结束任务', '看电影', '时长:', 1.2558932304382324, '进程id:', 32456)
('结束任务', '听歌', '时长:', 1.2618944644927979, '进程id:', 1776)
('结束任务', '打豆豆', '时长:', 1.887202262878418, '进程id:', 29632)
('结束任务', '读书', '时长:', 1.291977882385254, '进程id:', 20936)
over

阻塞式:

特点:添加一个,执行一个任务,如果一个任务不结束,另一个任务就进不来

import  multiprocessing,time,os
from random import random

def task(taskname):
    print('开始任务',taskname)
    start = time.time()
    #使用sleep
    time.sleep(random()*2) # 随机停歇一段时间
    end = time.time()
    print('完成任务{},时长{},进程id{}'.format(taskname,(end - start),os.getpid()))
  




if __name__ == '__main__':
    pool = multiprocessing.Pool(5)
    tasks = ['吃饭', '睡觉', '打豆豆', '听歌', '看电影', '读书']
    # 阻塞式
    for i in tasks:
        pool.apply(task,args=(i,)) #callback 回调
    pool.close()  # 添加任务结束
    pool.join()
    print('over')
-----------------------------------------------------------------------------
开始任务 吃饭
完成任务吃饭,时长1.4492807388305664,进程id11132
开始任务 睡觉
完成任务睡觉,时长0.07950091361999512,进程id9604
开始任务 打豆豆
完成任务打豆豆,时长0.2515096664428711,进程id31108
开始任务 听歌
完成任务听歌,时长0.4940202236175537,进程id31688
开始任务 看电影
完成任务看电影,时长1.12396240234375,进程id12708
开始任务 读书
完成任务读书,时长1.3488681316375732,进程id11132
over

进程间通信:

from multiprocessing import Queue

q = Queue(5) # 总共加5次,F超过,一直等待
q.put('A')
q.put('B')
q.put('C')
q.put('D')
q.put('E')
print(q.qsize())
q.put('F') # put() 如果queue满了则只能等待,除非有'空地'则添加成功
-------------------------------------------
结果如下

==================================================================

from multiprocessing import Queue

q = Queue(5) # 总共加5次,F超过,一直等待
q.put('A')
q.put('B')
q.put('C')
q.put('D')
q.put('E')
print(q.qsize())
if not q.full():  # q.empty() 判断队列是否为空
    q.put('F',timeout=3) # put() 如果queue满了则只能等待,除非有'空地'则添加成功
else:
    print('队列已满')
------------------------------
5
队列已满

 

from multiprocessing import Queue,Process
import time

def download(q):
    photo = ['girl.jpg','man.jpg','dog.jpg']
    for i in photo:
        print('下载照片{}完成'.format(i))
        time.sleep(0.5)
        q.put(i)
def getph(q):
    while True:
        try:
            file = q.get(timeout=2)
            print('获取照片{}'.format(file))
        except:
            print('所有照片打印完成')
            break

if __name__ == '__main__':
    q = Queue(5)
    p1 = Process(target=download,args=(q,))
    p2 = Process(target=getph,args=(q,)) # 共享q

    p1.start()
    p2.start()
--------------------------------------------------
下载照片girl.jpg完成
下载照片man.jpg完成
获取照片girl.jpg
下载照片dog.jpg完成
获取照片man.jpg
获取照片dog.jpg
所有照片打印完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值