zoukankan      html  css  js  c++  java
  • 4.2

    1.基于多线程实现并发的套接字通信
    server:
     1 # -*- coding:utf-8 -*-
     2 """基于多线程实现并发的套接字通信"""
     3 """有一个致命的问题,不能无限的开线程,机器会卡死了"""
     4 import socket
     5 from threading import Thread
     6 
     7 def task(conn):
     8     while True:
     9         try:
    10             data = conn.recv(1024)
    11             if not data: continue
    12             conn.send(data.upper())
    13         except Exception:
    14             break
    15     conn.close()
    16 
    17 def server(ip,port):
    18     server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    19     server.bind((ip,port))
    20     server.listen(5)
    21     while True:
    22         conn,addr = server.accept()
    23         t = Thread(target=task,args=(conn,))
    24         t.start()
    25     server.close()
    26 
    27 if __name__ == "__main__":
    28     server('127.0.0.1',8080)
    29 
    30 """应该将线程控制在一定的数量"""
    31 """
    32 进程池:。。。 io阻塞不用进程池了
    33 线程池:。。。
    34 """
    35 """基于线程池实现:"""
    36 import socket
    37 from threading import Thread,Semaphore
    38 from concurrent.futures import ThreadPoolExecutor
    39 
    40 def task(conn):
    41     # sm.acquire()
    42     while True:
    43         try:
    44             data = conn.recv(1024)
    45             if not data: break
    46             conn.send(data.upper())
    47         except Exception:
    48             break
    49     conn.close()
    50     # sm.release()
    51 
    52 def server(ip,port):
    53     server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    54     server.bind((ip,port))
    55     server.listen(5)
    56     while True:
    57         conn,addr = server.accept()
    58         pool.submit(task,conn)
    59         # t = Thread(target=task, args=(conn,))
    60         # t.start()
    61     server.close()
    62 
    63 
    64 if __name__ == "__main__":
    65     pool = ThreadPoolExecutor(2)  # 随着机器性能不同而不同  一般用 线程池 不用 信号量
    66     # sm = Semaphore(2)
    67     server('127.0.0.1',8080)
    client:
     1 import socket
     2 
     3 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     4 client.connect(('127.0.0.1',8080))
     5 while True:
     6     msg = input(">>>:").strip()
     7     if not msg:continue
     8     client.send(msg.encode('utf-8'))
     9     data = client.recv(1024)
    10     print(data.decode('utf-8'))
    2.编写一个简单的文本处理工具,具备三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件
     1 from threading import Thread
     2 import json
     3 import time
     4 
     5 def save(msg_upper):
     6     with open('db.txt','a',encoding='utf-8') as f:
     7         json.dump(msg_upper,f)
     8 
     9 def handle(msg):
    10     time.sleep(10)
    11     msg_upper = msg.upper()
    12     p2 = Thread(target=save,args=(msg_upper,))
    13     p2.start()
    14 
    15 def recv():
    16     while True:
    17         msg = input('>>>:').strip()
    18         p1 = Thread(target=handle, args=(msg,))
    19         p1.start()
    20 
    21 if __name__ == "__main__":
    22     recv()



  • 相关阅读:
    Linux从程序到进程
    Linux用户与“最小权限”原则
    Linux进程关系
    Linux信号基础
    Linux进程基础
    Sublime Text 报“Pylinter could not automatically determined the path to lint.py
    Linux文本流
    Linux文件管理相关命令
    Linux命令行与命令
    Linux架构
  • 原文地址:https://www.cnblogs.com/alice-bj/p/8708719.html
Copyright © 2011-2022 走看看