multiprocessing多进程--莫凡

#利用多核cpu来处理
#多核运算,创建进程
import multiprocessing as mp
import threading as td
def job(a,d):
    print('aaaaaa')
#t1=td.Thread(target=job,args=(1,2))
if __name__=='__main__':
    p1=mp.Process(target=job,args=(1,2))
    #t1.start()
    p1.start()
    #t1.join()
    p1.join()

输出:
aaaaaa

#queue进程输出
import multiprocessing as mp
import threading as td
def job(q):
    res=0
    for i in range(1000):
        res+=i+i**2+i**3
    q.put(res)#queue

#t1=td.Thread(target=job,args=(1,2))
if __name__=='__main__':
    q=mp.Queue()
    p1=mp.Process(target=job,args=(q,))
    p2=mp.Process(target=job,args=(q,))
    #t1.start()
    p1.start()
    p2.start()
    #t1.join()
    p1.join()
    p2.join()
    res1=q.get()
    res2=q.get()
    print(res1+res2)

输出:
499667166000

#效率对比,multithreading,multiprocessing
#queue进程输出
import multiprocessing as mp
import threading as td
import time
def job(q):
    res=0
    for i in range(100000):
        res+=i+i**2+i**3
    q.put(res)#queue

def multicore():
    q=mp.Queue()
    p1=mp.Process(target=job,args=(q,))
    p2=mp.Process(target=job,args=(q,))
    #t1.start()
    p1.start()
    p2.start()
    #t1.join()
    p1.join()
    p2.join()
    res1=q.get()
    res2=q.get()
    print('multicore',res1+res2)
#t1=td.Thread(target=job,args=(1,2))
def normal():
    res = 0
    for _ in range(2):
        for i in range(100000):
            res += i + i ** 2 + i ** 3
        print('normal',res)
def multithread():
    q = mp.Queue()
    t1 = td.Thread(target=job, args=(q,))
    t2 = td.Thread(target=job, args=(q,))
    # t1.start()
    t1.start()
    t2.start()
    # t1.join()
    t1.join()
    t2.join()
    res1 = q.get()
    res2 = q.get()
    print('multithread:',res1 + res2)
if __name__=='__main__':
    st=time.time()
    normal()
    st1=time.time()
    print('normal time:',st1-st)
    multithread()
    st2=time.time()
    print('multithread time:',st2-st1)
    multicore()
    print('multicore time:',time.time()-st2)

输出:
normal 24999833335833300000
normal 49999666671666600000
normal time: 0.12329483032226562
multithread: 49999666671666600000
multithread time: 0.14112567901611328
multicore 49999666671666600000
multicore time: 0.0751795768737793

#进程池pool
import multiprocessing as mp
def job(x):
    return x*x

def multicore():
    #定义利用几个核
    pool=mp.Pool(processes=2)
    res=pool.map(job,range(100))
    print(res)
    res=pool.apply_async(job,(2,))
    print(res.get())
if __name__ =='__main__':
    multicore()

输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801]
4


#进程池pool
import multiprocessing as mp
def job(x):
    return x*x

def multicore():
    #定义利用几个核
    pool=mp.Pool(processes=2)
    res=pool.map(job,range(100))
    print(res)
    res=pool.apply_async(job,(2,))
    print(res.get())
    multi_res=[pool.apply_async(job,(i,)) for i in range(10)]
    print([res.get() for res in multi_res])
if __name__ =='__main__':
    multicore()
#共享内存以及lock锁
import multiprocessing as mp
import time

def job(v,num,l):
    l.acquire()
    for _ in range(10):
        time.sleep(0.1)
        v.value+=num
        print(v.value)
    l.release()
def multicore():
    #不加上lock的话输出是没有顺序和规律的
    l=mp.Lock()
    v=mp.Value('i',0)
    p1=mp.Process(target=job,args=(v,1,l))
    p2=mp.Process(target=job,args=(v,3,l))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

if __name__=='__main__':
    multicore()
#这是一个共享的值,d表示整数
# value=mp.Value('d',1)
# array=mp.Array('i',[1,3,4])

输出:
1
2
3
4
5
6
7
8
9
10
13
16
19
22
25
28
31
34
37
40

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值