美文网首页程序员
进程和线程(1)

进程和线程(1)

作者: 梦捷者 | 来源:发表于2018-12-16 20:48 被阅读1次

    (一)并发和并行的深入理解

            1、并发和并行      (1)并发:在同一段时间中多个进程和进程在运行,并且这些进程和线程都在同一个处理机上运行。    (2)并行:在同一时刻执行多个程序(在一个以上的处理机的情况下进行,在Linux系统下线程不可能发生并发)

    (二)多进程

            1、进程的概念:进程就是执行中的程序(程序的一次执行)。    2、特点:(1)计算机程序只存储在磁盘上的可执行二进制文件中,只有把他们加载到内存中并被操作系统调用,才拥有其生命周期。(2)每个进程都有自己的地址空间、内存、数据栈以及以及其他用于跟踪执行的辅助数据。 (3)操作系统管理所有进程的执行,并且为它们分配合理的时间和标记编号。3、多进程并行的条件:总进程的数量不多于cpu的核心数量。

    代码实例:

    1、模仿耗时函数

    import time

    import random

    def fun():

            print(‘你好’)

            time.sleep(random.randint(1,3))

    if __name__=='__main__':

            start_time=time.time()

            fun()

            fun()

            end_time=time.time()

            print('执行此函数消耗了%s的时间'%(start_time-end_time))

    2、模仿多进程耗时函数(无参函数)

    import time

    import random

    from multiprocessing import Process

    def fun():

            print(‘你好’)

    time.sleep(random.randint(1,3))

    if __name__=='__main__':

            start_time=time.time()

            process1=Process(target=fun)

             process2=Process(target=fun)

            process1.start()

            process2.start()

            fun()

            end_time=time.time()

            print('执行此函数消耗了%s的时间'%(start_time-end_time))

    3、模仿多进程耗时函数(有参函数)

    import time

    import random

    from multiprocessing import Process

    def fun(a,b):

            r=a+b

            print(r)

            print(‘你好’)

            time.sleep(random.randint(1,3))

    if __name__=='__main__':

            start_time=time.time()

           process1=Process(target=fun,args=(2,2))

           process2=Process(target=fun,kwargs={'a':2,'b':2})

           process1.start()

            process2.start()

            fun()

            end_time=time.time()

            print('执行此函数消耗了%s的时间'%(start_time-end_time))

    (三)多线程

            1、概念:线程是程序执行流的最小单元。多任务可以由多进程完成,也可以由一个进程中的多线程完成。一个进程可以由多个线程组成,并且至少有一个线程(主线程)。2、当其他线程运行时,当前线程可以被抢占(中断)和临时挂起(也称为睡眠)。 3、在Python中,线程的调度不是由操作系统负责的,而是由Python解释器负责的。 4、GIL (全局解释性锁)    (1)在Python中,设计一个GIL是为了设计方便和线程安全。这个锁要求在任何进程中,一次只能有一个线程执行。 (2)在Python中,线程只能实现并发,不能实现并行(不能为多个线程分配多个cpu)    (3)GIL在任何IO阻塞的时候,会自动切换线程。

    (四)实现并发服务器

            1、多进程实现并发服务器

                import  socket

                import  os

                import   multiprocessing

                server=socket.socket()

                server.bind((' ',端口号))

                server.listen(567)

                def task(soc):

                        while True:

                                recv_data=soc.recv(1024)

                                if recv_data:

                                       print(recv_data.decode())

                                        soc.send(recv_data)

                                    else:

                                        break

                                        soc.close()

                while True:

                        conn,adrr=server.accept()

                        process=multiprocess.Process(target=task,args=(conn,))

                        process.start()

             2、多线程实现并发服务器

                    import  socket

                    from threading  import Thread

                    server=socket.socket()

                    server.bind((' ',端口号))

                    server.listen(567)

                    def task(soc):

                            while True:

                                recv_data=soc.recv(1024)

                                if recv_data:

                                        print(recv_data.decode())

                                        soc.send(recv_data)

                                 else:

                                        break

                                        soc.close()

                       while True:

                                conn,adrr=server.accept()

                                thread=.Thread(target=task,args=(conn,))

                                thread.start()

    相关文章

      网友评论

        本文标题:进程和线程(1)

        本文链接:https://www.haomeiwen.com/subject/pxbxkqtx.html