zoukankan      html  css  js  c++  java
  • 进程相关操作

    python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。

    Python提供了multiprocessing。multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。

    简单的进程程序:

    import multiprocessing  #引入模块
    def task(arg):
        print(arg)
    
    def run():
        for i in range(10):#循环创建十个进程  
         p=multiprocessing.Process(target=task,args=(i,)) p.start() #准备好执行进程 if __name__=="__main__": run()

    常用功能:

    join():括号内有参数时,指定等待子进程的时间,时间到了以后继续向下执行,无参数时,等待子进程执行完毕以后继续向下执行.

    daemon():括号内默认值是False,手动改成True后,优先执行主进程,执行完不等待子进程是否已经执行完.

    name():创建进程名称   name=multiprocessing.current_process()#获取线程名字

    创建进程(两种方式):

    1 类继承方法创建:

    import multiprocessing
    class MyProcess(multiprocessing.Process):
        def run(self):
            print("当前进程是:",multiprocessing.current_process())
    
    def run():
        p1=MyProcess()#进程一
        p1.start()  #自动执行类里面的run方法
        p2=MyProcess()
        p2.start()#进程二
    
    if __name__=="__main__":
        run()

    2普通方法

    import multiprocessing
    
    def task():
        print("当前进程是:",multiprocessing.current_process())
    
    def run():
        for i in range(2):
            p=multiprocessing.Process(target=task,)
            p.start()
    
    if __name__=="__main__":
        run()

    数据共享:

    1 Queue:

    import multiprocessing
    def task(arg,q):
        q.put(arg)
    if __name__=="__main__":
        q = multiprocessing.Queue()
        for i in range(10):
            p = multiprocessing.Process(target=task,args=(i,q,))
            p.start()
        while True:
            v = q.get()
            print(v)
    import mulprocessing
    q = multiprocessing.Queue()
    
        def task(arg,q):
        q.put(arg)
    
    def run():
        for i in range(10):
            p = multiprocessing.Process(target=task, args=(i, q,))
        p.start()
    
        while True:
        v = q.get()
        print(v)
    
    run()
    linux

    2 Manger:

    import multiprocessing
    import time
    def func(arg,dic):
        time.sleep(2)
        dic[arg] = 100
    
    
    if __name__ == "__main__":
        m = multiprocessing.Manager()
        dic = m.dict()
    
        process_list = []
        for i in range(10):
            p = multiprocessing.Process(target=func, args=(i, dic,))
            p.start()
    
            process_list.append(p)
    
        while True:
            count=0
            for p in process_list:
                if not p.is_alive():
                    count+=1
            if count==len(process_list):
                break
        print(dic)

    进程锁:与线程用法一致.

    import time
    import multiprocessing
    
    
    lock = multiprocessing.RLock()
    
    def task(arg):
        print('鬼子来了')
        lock.acquire()
        time.sleep(2)
        print(arg)
        lock.release()
    
    
    if __name__ == '__main__':
        p1 = multiprocessing.Process(target=task,args=(1,))
        p1.start()
    
        p2 = multiprocessing.Process(target=task, args=(2,))
        p2.start()

    进程池:限制进程最多创建的数

    import multiprocessing
    from concurrent.futures import ProcessPoolExecutor
    
    def task():
        print("当前进程是:",multiprocessing.current_process())
        time.sleep(1)
    
    if __name__=="__main__":
        pool=ProcessPoolExecutor(5)
        for i in range(10):
            pool.submit(task,)
    
    
    打印结果为:
    当前进程是: <Process(Process-2, started)>
    当前进程是: <Process(Process-3, started)>
    当前进程是: <Process(Process-4, started)>
    当前进程是: <Process(Process-1, started)>
    当前进程是: <Process(Process-5, started)>
    一秒钟以后:
    当前进程是: <Process(Process-2, started)>
    当前进程是: <Process(Process-3, started)>
    当前进程是: <Process(Process-4, started)>
    当前进程是: <Process(Process-1, started)>
    当前进程是: <Process(Process-5, started)>

     

    简单爬虫:

    import requests
    from bs4 import BeautifulSoup
    from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
    
    def task(url):
        print(url)
        r1=requests.get(url=url,headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
             })
    
        #查看下载下来的文本信息
        soup=BeautifulSoup(r1.text,'html.parser')
        print(soup.text)
        # content_list=soup.find('div',attrs={'id':content_list})
        # for item in content_list.find_all('div',attr={'class':'item'})
        #       title = item.find('a').text.strip()
        #       target_url = item.find('a').get('href')
        #       print(title,target_url)
    
    def run():
        pool=ThreadPoolExecutor(5)
        for i in range(1,50):
            pool.submit(task,'https://dig.chouti.com/all/hot/recent/%s'%i)
  • 相关阅读:
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Maximum Depth of Binary Tree
    Sharepoint 2013 创建TimeJob 自动发送邮件
    IE8 不能够在Sharepoint平台上在线打开Office文档解决方案
    TFS安装与管理
    局域网通过IP查看对方计算机名,通过计算机名查看对方IP以及查看在线所有电脑IP
    JS 隐藏Sharepoint中List Item View页面的某一个字段
    SharePoint Calculated Column Formulas & Functions
    JS 两个一组数组转二维数组
  • 原文地址:https://www.cnblogs.com/lingcai/p/9636363.html
Copyright © 2011-2022 走看看