博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
进程和线程的区别, 面相对象补充, 进程, 数据共享, 锁, 进程池, 爬虫模块(requests, bs4(beautifulsoup))...
阅读量:6182 次
发布时间:2019-06-21

本文共 4665 字,大约阅读时间需要 15 分钟。

一. 进程和线程的区别?

    第一:
        进程是cpu资源分配的最小单元。
        线程是cpu计算的最小单元。
    第二:
        一个进程中可以有多个线程。
    第三:
        对于Python来说他的进程和线程和其他语言有差异,是有GIL锁。
        GIL锁保证一个进程中同一时刻只有一个线程被cpu调度。
    IO密集型操作可以使用多线程;计算密集型可以使用多进程;
    
二. 面向对象补充:

class Foo(object):    def __init__(self):        object.__setattr__(self, 'info', {}) # 在继承的对象中设置值的本质    def __setattr__(self, key, value):          # 会拦截所有属性的的赋值语句        self.info[key] = value    def __getattr__(self, item):         #  拦截点号运算。当对未定义的属性名称和实例进行点号        # 运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法        print(item)             # name        return self.info[item]obj = Foo()obj.name = 'nacho'print(obj.name)     # nachoprint(obj.info)     # {'name': 'nacho'}

 

三. 进程

    - 进程间数据不共享

data_list = []def task(arg):    data_list.append(arg)    print(data_list)def run():    for i in range(10):        p = multiprocessing.Process(target=task,args=(i,))        # p = threading.Thread(target=task,args=(i,))        p.start()if __name__ == '__main__':      # win10需要用这个, linux不需要    run()

    - 常用功能:

        - join
        - deamon
        - name
        - multiprocessing.current_process()
        - multiprocessing.current_process().ident/pid
    - 类继承方式创建进程

class MyProcess(multiprocessing.Process):    def run(self):        print('当前进程',multiprocessing.current_process())    def run():        p1 = MyProcess()        p1.start()        p2 = MyProcess()        p2.start()if __name__ == '__main__':    run()

 

四. 进程间数据共享

Queue:    linux:        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()    windows:        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)Manager:(*)    Linux:        m = multiprocessing.Manager()        dic = m.dict()        def task(arg):            dic[arg] = 100        def run():            for i in range(10):                p = multiprocessing.Process(target=task, args=(i,))                p.start()            input('>>>')            print(dic.values())        if __name__ == '__main__':            run()    windows:        def task(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=task, 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 timeimport threadingimport multiprocessinglock = 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 timefrom concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutordef task(arg):    time.sleep(2)    print(arg)if __name__ == '__main__':    pool = ProcessPoolExecutor(6)      # 取决于CPU的核心数    for i in range(10):        pool.submit(task,i)

 

七. 爬虫:
    示例:

import requestsfrom bs4 import BeautifulSoupfrom concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor# 模拟浏览器发送请求# 内部创建 sk = socket.socket()# 和抽屉进行socket连接 sk.connect(...)# sk.sendall('...')# sk.recv(...)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',attrs={'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)if __name__ == '__main__':    run()

 

转载于:https://www.cnblogs.com/NachoLau/p/9637177.html

你可能感兴趣的文章
解决SpringBoot项目打成jar包访问不了jsp模板的问题: SpringBoot项目集成jsp模板打成war包 然后通过java -jar 命令启动访问...
查看>>
我的友情链接
查看>>
Linux 的启动流程
查看>>
Microsoft SQL Server 自定义函数整理大全
查看>>
文件下载文件名乱码
查看>>
苹果支持NTFS格式移动硬盘的处理
查看>>
SEP升级
查看>>
百行HTML5代码实现四种双人对弈游戏
查看>>
中小型企业证书认证服务器的搭建详解
查看>>
ProxmoxVE 之 oracle12C 多CDB和PDB
查看>>
SetFileTime
查看>>
记录新机房建设。20130715
查看>>
POJ 1274 The Perfect Stall 题解 《挑战程序设计竞赛》
查看>>
WinAPI: OpenProcess、GetExitCodeProcess、TerminateProcess (测试强制关闭 OICQ)
查看>>
reboot
查看>>
Ajax+Jsp+servlet+json技术的使用
查看>>
Ajax+JQuery+JSon传输中文字符时,必须注意中文字符的编码解码工作
查看>>
JSP 九大内置对象及其作用域
查看>>
android 在子线程中如何把自定义对象传到handler中处理
查看>>
两分钟彻底让你明白Android Activity生命周期(图文)
查看>>