• 进程


    什么是进程:

      进程就是正在执行的一段程序代码。

    进程与程序的关系:

      程序只是一堆的代码,而进程是操作系统为这一堆代码执行所创建的内存空间。

    进程需要使用的模块:

    1 from multiprocessing    import  Process

    该模块下需要掌握的方法:

      start()方法--------------->开启进程

     1 from  multiprocessing  import   Process
     2 import   time
     3 def  test(name):
     4     print('%s is running'%name)
     5     time.sleep(3)
     6 
     7 if __name__ == '__main__':#在windows系统下,开子进程的代码必须写到这一行下面
     8     p = Process(target=test,args=('liuyinzhou',))#创建进程
     9     p.start()#开启进程。给操作系统发送一个信号,让操作系统开进程(申请内存+拷贝父进程的地址空间,但该进程执行的时间由操作系统决定
    10     print('done')

      join()方法----------->等待进程的完成

     1 from  multiprocessing  import  Process
     2 import os
     3 import  time
     4 def   task():
     5     print('run',os.getpid())
     6     time.sleep(3)
     7     print('done',os.getpid())
     8 if __name__ == '__main__':
     9     p1 = Process(target=task,)
    10     p1.start()#父进程等待子进程的完成,直到子进程运行完之后才会执行下面的代码。
    11     print('',os.getpid())

    使用进程实现并发

     1 from  socket import  *
     2 import  threading
     3 
     4 def xiancheng(ip,port):
     5         server = socket(AF_INET, SOCK_STREAM)
     6         server.bind((ip,port))
     7         server.listen(5)
     8         while True:
     9             client, add = server.accept()
    10             print(add)
    11             p = threading.Thread(target=commu, args=(client,))
    12             p.start()
    13         server.close()
    14 
    15 def commu(client):
    16         while True:
    17             try:
    18                 data_bytes= client.recv(1024)
    19                 if not data_bytes:break
    20                 client.send(data_bytes.upper())
    21             except Exception:
    22                 break
    23         client.close()
    24 
    25 if __name__ == '__main__':
    26     xiancheng('127.0.0.1',8878)
    进程实现并发服务端
     1 from  socket import  *
     2 client = socket(AF_INET,SOCK_STREAM)
     3 ip_port = ('127.0.0.1',8878)
     4 client.connect(ip_port)
     5 while  True:
     6     msg = input('>>>:')
     7     if not msg :continue
     8     client.send(msg.encode('utf-8'))
     9     server_data = client.recv(1024)
    10     print(server_data.decode('utf-8'))
    11 client.close()
    进程实现并发客户端

    存在的问题:

      目前确实实现了并发,但是如果有一万个客户端请求,那么就会在服务端创建一万个进程,此时服务端的服务器已经死掉了,因此不行无限制的在客户端开多个进程实现并发。解决的办法是:进程池。

    进程池:

     1 '''
     2 提交或调用任务的方式:
     3     1.同步调用,提交或调用一个任务时,然后在原地等待,等待该任务执行完毕以及拿到结果后,再执行下一个任务
     4     2.异步调用:提交或调用一个任务时,不在原地等待,直接执行下面的任务,等所有任务都执行完之后,再调用每次任务的结果
     5 '''
     6 from concurrent.futures import ProcessPoolExecutor
     7 import  time,random,os
     8 
     9 def piao(name,i):
    10     print('%s is piaoing %s'%(name,os.getpid()))
    11     time.sleep(random.randint(1,4))
    12     return i**2
    13 if __name__ == '__main__':
    14 
    15     objs = []
    16     p = ProcessPoolExecutor(5)#创建进程池对象,并指定进程池大小,向操作系统发送创建五个进程信号,等待提交任务
    17     # for i  in range(10):#使用for循环把任务提交给进程池,但每次只能执行5个进程,操作的对象是进程池(五个进程),不是五个单个的进程
    18     #     res = p.submit(piao,'alex %s'%i,i).result() ---------------> 同步调用
    19     #     print(res)
    20 
    21 
    22     for i  in range(10):#使用for循环把任务提交给进程池,但每次只能执行5个进程,操作的对象是进程池(五个进程),不是五个单个的进程
    23         obj = p.submit(piao,'alex %s'%i,i) # ---------------> 异步调用
    24         objs.append(obj)#------------>每次只是获取进程对象。
    25 
    26     for obj  in  objs:#只要是某个进程运行完毕,得到结果后就会打印。
    27         print(obj.result()) #由于采用异步的调用方式,因此在遍历列表的过程当中有可能某些进程还没有执行完成。
    28 
    29     p.shutdown(wait=True,)#阻止外来任务的提交,等待进程池中的任务都执行完毕,再运行之后的代码
    30     print('主进程',os.getpid())
    进程池实现并发

    存在的问题:

      目前确实解决了之前大量进程对服务器的影响,但是创建进程需要的时间长,解决这一问题的办法就是:线程

    注意:

      不管是使用进程还是线程实现并发,线程与进程的运行时间都不可控,即不收人为控制,两者的运行时间由操作系统决定。

  • 相关阅读:
    Selenium 面试题总结
    springbatch 给自定义的processor传递JobParameters中设置的参数
    spring batch 相关的九张表的初始化脚本
    springbatch 读取csv文件时 文件中有字符串需要转换为Date类型的字段报错字符串不能转化为Date类型的解决方法
    spring+quartz定时任务配置---MethodInvokingJobDetailFactoryBean
    springmvc+mybatis+html 下将查询数据以excell形式上传到ftp(下)
    springmvc+mybatis+html 下将查询数据以excell形式上传到ftp(上)
    入门 ARM 汇编(二)—— 寻址方式
    系统进程 zygote(二)—— zygote.rc 脚本
    系统进程 zygote(一)—— 概述
  • 原文地址:https://www.cnblogs.com/liuyinzhou/p/7966925.html
Copyright © 2020-2023  润新知