• 深层次的进程线程的并发操作


    基于socket实现的线程并发

    实现方式一:

      实现socket模块的的服务器并发效果,类似于服务器一直处于监听状态,有数据过来我就不停的接收,通过socketserver模块就可以实现。(自行了解该模块)

    实现方式二:

      利用线程。

     1 # 服务端
     2 # 导入相关的模块
     3 from threading import Thread
     4 import socket
     5 
     6 
     7 server = socket.socket()
     8 server.blind(('127.0.0.1'. 8080))
     9 server.listen(5)
    10 
    11 # 定义执行线程的函数
    12 def task(conn):
    13     while True:
    14             try:
    15                  data = conn.recv(1024)
    16                  print(data.decode('utf-8'))
    17             
    18                  conn.send(data.upper())
    19             except ConnenctResetError:
    20                   break
    21     conn.close()
    22 
    23 
    24  
    25 while True:
    26         conn,addr = server.accept()
    27         print(addr)
    28         t = Thread(target=task, args=(conn,))
    29         t.start()

     

     1 # 客户端
     2 import socket
     3 
     4 cilent = socket.socket()
     5 cilent.connect(('127.0.0.1', 8080))
     6 
     7 
     8 while True:
     9     cmd = input('>>>>>>')
    10     if len(cmd) == 0:continue
    11     cilent.send(cmd.encode('utf-8'))
    12 
    13     data = cilent.recv(1024)
    14     print(data.decode('utf-8'))
    15     cilent.close()

    进程池和线程池

      首先什么是池?

        池,就是池塘。装载数据的容器。

        进程池:相当于在池糖里固定的有若干个水坑,并且这个水坑就是在池塘创建好的时候规定好有若干个坑。

        线程池:池子里有五个线程,来几个就是执行几个。

      使用池的优点:

        1.为了减缓计算机硬件的压力,避免计算机硬件设备崩溃

        2.虽然减轻了计算机硬件的压力,但是一定程度上降低了持续的效率

      使用进程池和线程池的目的:为了开设限定个数的进程和线程数,从而保证计算机的硬件安全。

     

     1 # 实现进程池和线程池
     2 # 进程池和线程池抖存在相同的模块下 concurrent.futures
     3 from concurrent.futures  import ThreadPoolExecutor, ProcessPoolExecutor 
     4 
     5 import time
     6 
     7 
     8 # 这里以开设线程为例,进程一样
     9 # 开设一个池,最大数目为:5,默认最大为cpu的5倍
    10 pool = ThreadPoolExecutor(5)
    11 
    12 
    13 def task(n):
    14     print(n)
    15     time.sleep(3)
    16     return n**2
    17 
    18 
    19 # 接收回调函数的值,并处理的函数
    20 def answer(obj):
    21     print('answer is %s' %obj.result()) 
    22 
    23 
    24 if __name__ =="__main__":
    25     # 创建10个线程
    26     for i in range(10):
    27          pool.submit(task,i).add_done_callback(answer)
    28 
    29    # 等待线程结束调用
    30     pool.stutdown()
    31     print('')

     

    协程

      协程的由来:为了实现单线程并发的效果。

        协程:完全是我们高技术的人自己编出来的名词
             通过代码层面自己监测io自己实现切换,让操作系统误认为你这个线程没有io
        切换+保存状态就一定能够提升你程序的效率吗?不一定
             当你的任务是计算密集型,反而会降低效率
             如果你的任务是IO密集型,会提升效率

    # 基于单线程实现的并发(socket)服务端
    from gevent import monkey;monkey.patch_all()
    from gevent import spawn
    import socket
    
    
    def commuciate(conn):
        while True:
            try:
                data = conn.recv(1024)
                if len(data) ==0 :break
                print(data.decode('utf-8'))
    
                conn.send(data.upper())
            except ConnectionResetError:
                break
        conn.close()
    
    
    def server():
        server = socket.socket()
        server.bind(('127.0.0.1', 8080))
        server.listen(5)
    
        while True:
            conn, addr = server.accept()
            spawn(commuciate, conn)
    
    
    if __name__ == '__main__':
        s1 = spawn(server)
        s1.join()
    # 基于单线程实现的并发(socket)客户端
    # 实现500个线程的协程
    from threading import Thread
    import socket
    
    cilent = socket.socket()
    cilent.connect(('127.0.0.1', 8080))
    
    
    def task():
        while True:
            cilent.send(b'hello')
    
            data = cilent.recv(1024)
            print(data.decode('utf-8'))
    
    
    if __name__ == '__main__':
        for i in range(500):
            t = Thread(target=task)
            t.start()
  • 相关阅读:
    Ubuntu安装最新版的nodejs
    Mac安装并破解OmniGraffle7
    Mac安装并破解StarUML
    Windows10使用Chocolatey安装mysql之后无法使用的解决办法
    Visual Studio编辑类模板的位置
    VS2017连接到中国区的Azure
    Windows上包管理器之Chocolatey初体验
    CENTOS7.3 64位架设使用MYSQL数据库的ASP.NET CORE网站
    从无到有开发自己的Wordpress博客主题---主页模板
    c# 获得方法的所属类(或调用者)的类名,方法名
  • 原文地址:https://www.cnblogs.com/wanglei957/p/10838795.html
Copyright © 2020-2023  润新知