第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

python之multiprocessing創(chuàng)建進(jìn)程

標(biāo)簽:
Python

python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录。

fork方式的缺点:

  1. 兼容性差,只能在类linux系统下使用,windows系统不可使用;

  2. 扩展性差,当需要多条进程的时候,进程管理变得很复杂;

  3. 会产生“孤儿”进程和“僵尸”进程,需要手动回收资源。

优点:

是系统自带的接近低层的创建方式,运行效率高。

Process创建进程

from multiprocessing import Queue, Processimport osdef test():
    time.sleep(2)
    print('this is process {}'.format(os.getpid()))if __name__ == '__main__':
    p = Process(target=test)
    p.start() # 子进程 开始执行
    p.join() # 等待子进程结束
    print('ths peocess is ended')
from multiprocessing import Queue, Processimport osclass MyProcess(Process):

    def run(self):
        time.sleep(2)
        print('this is process {}'.format(os.getpid()))    def __del__(self):
        print('del the process {}'.format(os.getpid()))if __name__ == '__main__':
    p = MyProcess()
    p.start()
    print('ths process is ended')# 结果:ths process is ended
this is process 7600del the process 7600del the process 12304

说明:

Process对象分析

class Process(object):
    def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
        pass
# Process对象是python用来创建进程的类
group:扩展保留字段;
target:目标代码,一般是我们需要创建进程执行的目标函数。
name:进程的名字,如果不指定会自动分配一个;
args:目标函数的普通参数;
kwargs:目标函数的键值对参数;

# 方法
start():创建一个子进程并执行,该方法一个Process实例只能执行一次,其会创建一个进程执行该类的run方法。
run():子进程需要执行的代码;
join():主进程阻塞等待子进程直到子进程结束才继续执行,可以设置等待超时时间timeout.
terminate():使活着的进程终止;
is_alive():判断子进程是否还活着。

进程池Pool

如果需要创建大量的进程,就需要使用Pool了。

from multiprocessing import Queue, Process, Poolimport osdef test():
    time.sleep(2)
    print('this is process {}'.format(os.getpid()))def get_pool(n=5):
    p = Pool(n) # 设置进程池的大小
    for i in range(10):
        p.apply_async(test)
    p.close() # 关闭进程池
    p.join()if __name__ == '__main__':
    get_pool()
    print('ths process is ended')

分析:

Pool对象分析

class Pool(object):
    def __init__(self, processes=None, initializer=None, initargs=(),
                 maxtasksperchild=None, context=None):
        pass
# 初始化参数
processes:进程池的大小,默认cpu内核的数量
initializer:创建进程执行的目标函数,其会按照进程池的大小创建相应个数的进程;
initargs:目标函数的参数
context:代码的上下文

# 方法
apply():使用阻塞方式调用func;
apply_async():使用非阻塞方式条用func;
close():关闭Pool,使其不再接受新的任务;
terminate():不管任务是否完成,立即终止;
join():主进程阻塞,等待子进程的退出,必须在close()后面使用;
map(self, func, iterable, chunksize=None):多进程执行一个函数,传入不同的参数;
starmap(self, func, iterable, chunksize=None):和map类似,但iterable参数可解压缩;
starmap_async(self, func, iterable, chunksize=None, callback=None,error_callback=None):使用异步的方式的starmap,callback为返回后的处理函数
map_async(self, func, iterable, chunksize=None, callback=None,error_callback=None):异步方式的map
from multiprocessing import Poolimport osdef test(n):
    time.sleep(1)
    print('this is process {}'.format(os.getpid()))    return ndef test1(n, m):
    print(n, m)
    print('this is process {}'.format(os.getpid()))def back_func(values): # 多进程执行完毕会返回所有的结果的列表
    print(values)def back_func_err(values): # 多进程执行完毕会返回所有错误的列表
    print(values)def get_pool(n=5):
    p = Pool(n)    # p.map(test, (i for i in range(10))) # 阻塞式多进程执行
    # p.starmap(test1, zip([1,2,3],[3,4,5])) # 阻塞式多进程执行多参数函数
    # 异步多进程执行函数
    p.map_async(test, (i for i in range(5)), callback=back_func, error_callback=back_func_err)    # 异步多进程执行多参数函数
    p.starmap_async(test1, zip([1,2,3],[3,4,5]), callback=back_func, error_callback=back_func_err)
    print('-----')
    p.close()
    p.join()if __name__ == '__main__':
    get_pool()
    print('ths process is ended')

进程锁

进程虽然不像线程那样共享内存的数据,而是每个进程有单独的内存,但多进程也是共享文件系统的,即硬盘系统;当多进程同时写入文件操作时,可能造成数据的破坏,因此进程也存在同步锁。

from multiprocessing import Pool, Lockmuex = Lock()def test():    if muex.acquire():
        f = open('./test_pro.txt', 'r+', encoding='utf-8')
        x = f.read()        if not x:
            f.write('0')        else:
            f.seek(0)
            f.write(str(int(x)+1))
        f.close()
        muex.release()if __name__ == '__main__':
    p = Pool(5)    for i in range(10):
        p.apply_async(test)
    p.close()
    p.join()    with open('./test_pro.txt', 'r+', encoding='utf-8') as f:
        print(f.read())

进程锁可以保证文件系统的安全,但是它使得并行变成了串行,效率下降了,也可能造成死锁问题,一般避免用锁机制。

原文出处:https://www.cnblogs.com/cwp-bg/p/9564065.html

點(diǎn)擊查看更多內(nèi)容
1人點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消