程序员

进程和线程(1)

2018-12-16  本文已影响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()

上一篇下一篇

猜你喜欢

热点阅读