zoukankan      html  css  js  c++  java
  • Python — 进程和线程

    并行和并发

    并发:当有多个线程在操作时,如果系统只有一个CPU,吧CPU运行时间划分成若干个时间段,分配给若干个时间段,

               分配给各个线程执行,在一个程序代码运行时,其它线程处于挂起状态。这种方式我们称之为并发。

               并发=间隔发生

    并行:当系统有一个以上的CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另

                一个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行。

                并行=同时发生

    高并发是互联网分布式系统架构设计中必须考虑的因素之一,通常是指通过设计保证系统能够同时并行处理很多请求。

    区别:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或者多个事件在同一时间间隔内发生。       

     进程和线程

        概念:进程就是操作系统中执行的一个程序,一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个

                   可以获得CPU调度的执行单元,这就是所谓的线程

        优缺点:由于线程在同一个进程下,它们可以共享相同的上下文,因此相对于进程而言,线程间的信息共享和通

                      信更加容易。当然在单核CPU系统中,真正的并发是不可能的,因为在某个时刻能够获得CPU的只有唯

                       一的一个线程,多个线程共享了CPU的执行时间。使用多线程实现并发编程为程序带来的好处是不言而

                       喻的,最主要的体现在提升程序的性能和改善用户体验,当然多线程也并不是没有坏处,站在其他进程

                       的角度,多线程的程序对其他程序并不友好,因为它占用了更多的CPU执行时间,导致其他程序无法获

                       得足够的CPU执行时间;另一方面,站在开发者的角度,编写和调试多线程的程序都对开发者有较高的

                       要求,对于初学者来说更加困难。

         Python实现并发编程主要有3种方式:多进程、多线程、多进程+多线程。

      

    """
    单进程
    
    """
    from multiprocessing import Process
    from os import getpid
    from random import randint
    from time import time, sleep
    
    
    def download_task(filename):
        print('启动下载进程,进程号[%d].' % getpid())
        print('开始下载%s...' % filename)
        time_to_download = randint(5, 10)
        sleep(time_to_download)
        print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
    
    
    def main():
        start = time()
        p1 = Process(target=download_task, args=('Python从入门到住院.pdf', ))
        p1.start()
        p2 = Process(target=download_task, args=('Peking Hot.avi', ))
        p2.start()
        p1.join()
        p2.join()
        end = time()
        print('总共耗费了%.2f秒.' % (end - start))
    
    
    if __name__ == '__main__':
        main()
    此处为以上代码运行一次的结果:
    启动下载进程,进程号[1420]. 开始下载Python从入门到住院.pdf... 启动下载进程,进程号[1431]. 开始下载Peking Hot.avi... Peking Hot.avi下载完成! 耗费了6秒 Python从入门到住院.pdf下载完成! 耗费了11秒 总共耗费了11.01秒.
    """
    多进程
    
    """
    # 多进程的库
    from multiprocessing import Process
    from random import randint
    from time import time, sleep
    import os
    
    
    def download_task(filename):
        print('开始下载%s' % filename)
        time_to_download = randint(5, 10)
        sleep(time_to_download)
        print('%s 下载完成,经过%d秒' % (filename, time_to_download))
    
    
    def main():
    
        start = time()
        # 开启两个多进程,     函数名              传递的参数,需要注意的是,它接受的是一个元组(tuple)
        p1 = Process(target=download_task, args=('论.......mp4', ))
        p2 = Process(target=download_task, args=('l论.......mp5', ))
        # 获取进程号
    
        # 启动进程
        p1.start()
        p2.start()
    
        ##############
        # 进程阻塞.
        p1.join()
        p2.join()
        ##############
        end = time()
        print(end - start)
    
    
    if __name__ == '__main__':
        main()
    
    import requests
    
    url = 'http://op.hanhande.net/shtml/op_wz/list_2602_2.shtml'
    response = requests.get(url)
    response.encoding = 'gbk'
    HTML = response.text
    print(HTML)
     
     
      
     
  • 相关阅读:
    【258】雅思口语常用话
    【256】◀▶IEW-答案
    UITabBarController 标签栏控制器
    枚举
    HDU3631:Shortest Path(Floyd)
    让Barebox正确引导Tiny6410的linux内核
    调度子系统2_核心调度器
    12.10 公司面试总结
    X265编译中C2220错误的解决办法
    JSP元素和标签
  • 原文地址:https://www.cnblogs.com/liyuanyuan97/p/11328586.html
Copyright © 2011-2022 走看看