zoukankan      html  css  js  c++  java
  • 线程与threading模块

     线程

      进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位。在单个进程中同时运行多个线程完成不同的工作,称为多线程。

      同一进程内的多个线程是共享该进程的资源。

      创建新的线程开销要远远小于开启新的进程。

    threading模块

      线程的threading模块与进程的multiprocessing模块很类似。  

      模块下的类:

        Thread

        active_count

        enumerate

        current_thread

      方法:

        start()

        join()

        daemon() 守护线程和守护进程有点不一样。主线程在执行完所有非守护线程后,主线程结束,守护线程随之结束。

      示例:

    rom threading import Thread,current_thread,active_count,enumerate
    import time
    def bar():
        print('%s is running'%current_thread().getName() )
        time.sleep(2)
        print('%s is over'%current_thread().getName() )
    def foo():
        print('%s is running' % current_thread().getName())
        time.sleep(5)
        print('%s is over' % current_thread().getName())
    if __name__ == '__main__':
        t1=Thread(target=bar)
        t2=Thread(target=foo)
        t1.start()
        t2.daemon=True
        t2.start()
        print(enumerate())
        print(active_count())
        print('%s is 主线程' %current_thread().getName())

      输出:

    Thread-1 is running
    Thread-2 is running
    [<_MainThread(MainThread, started 816)>, <Thread(Thread-1, started 7528)>, <Thread(Thread-2, started daemon 13788)>]
    3
    MainThread is 主线程
    Thread-1 is over

       PS:

      多线程用于IO密集型,如socket,爬虫,web
      多进程用于计算密集型,如金融分析

      

      

    from multiprocessing import Process
    from threading import Thread
    import time
    def foo():
        sum=0
        for i in range(100000000):
            sum+=i
    
    if __name__ == '__main__':
        start_time=time.time()
        n=os.cpu_count()
        l=[]
        for i in range(n):
            t=Thread(target=foo,)         #41s
            # p=Process(target=foo,)       #9.89s
            # l.append(p)
            l.append(t)
            # p.start()
            t.start()
        for p in l:
            # p.join()
            p.join()
        print('time:',time.time()-start_time)

    作业:

      三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件。

    from threading import Thread
    msg_l=[]                    #
    format_l=[]                 #这两个是关键呀,相当于进程中的全局变量,进程中的数据(全局变量)是共享的,任何一个线程都可以访问的到。
    def talk():                 #三个函数,开启三个线程,做到各司其职,互不干涉,存取数据到进程中的全局变量取就可以了。
        while True:
            msg=input('>>: ').strip()
            if not msg:continue
            msg_l.append(msg)
    
    def format_msg():
        while True:
            if msg_l:
                res=msg_l.pop()
                format_l.append(res.upper())
    
    def save():
        while True:
            if format_l:
                with open('db.txt','a',encoding='utf-8') as f:
                    res=format_l.pop()
                    f.write('%s
    ' %res)
    
    if __name__ == '__main__':
        t1=Thread(target=talk)
        t2=Thread(target=format_msg)
        t3=Thread(target=save)
        t1.start()
        t2.start()
        t3.start()

      思路还是很6的。

  • 相关阅读:
    Hadoop配置
    大数据总览
    Shell(五)Shell输入/输出重定向
    善用try catch来使不可避免的错误发生时,程序不崩溃,只是终止该进程。
    silverlight 程序发布
    linq查distinct
    silverlight 服务端与客户端分2个VS程序打开,同时调试
    将25转成00025的方法
    【转】C#导出数据到EXCEL方法谈(附实例源码和超级无敌详细讲解)
    LINQ处理List数据
  • 原文地址:https://www.cnblogs.com/654321cc/p/7661849.html
Copyright © 2011-2022 走看看