自己设计线程池,要从哪些方面考虑

1.高并发、任务执行时间段 的业务使用什么样的线程池
2.并发不高、任务执行时间长的的业务怎样使用线程池
3.并发搞、业务执行时间长的业务怎样使用线程池

线程池的本质是生产者和消费者模型,包括三要素:

  • 往线程队列中投递任务的生产者
  • 任务池队列
  • 从任务池队列取出任务执行的worker线程(消费者)

想要合理配置线程池的大小,就要分析线程池任务的特性,可以从以下几个方面进行分析:
根据任务性质分:

  • cpu密集型
  • IO密集型
  • 混合型任务

根据任务的优先级:

根据任务的执行时间:

不同性质的任务可以交给不同配置的线程池执行:
cpu密集型任务配置尽可能小的线程,如配置cpu个数+1个线程;IO密集型任务应配置尽可能多的线程,因为IO操作不占用cpu,不要让cpu闲下来,应加大线程的数量,如配置两倍cpu数量+1个线程;对于混合型的任务,如果可以拆分,拆换成IO密集型和cpu密集型分别处理,如果两种处理方式时间差距很大则没必要拆分。
如果任务执行时间长,在worker线程数量有限的情况下,worker很快就被任务占用,导致后续任务不能及时被处理,此时应增加worker线程数量;反过来,如果任务执行时间短,那么worker线程数量不用太多,太多的worker线程会导致过多的时间浪费在线程上下文切换上。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程/线程池TCP服务器端程序设计需要考虑以下几个方面: 1. 网络通信:使用socket进行TCP通信,需要考虑如何接收和发送数据。 2. 多线程/线程池:使用多线程或线程池来处理客户端连接请求,可以提高服务器的并发性能。 3. 数据处理:对接收到的数据进行处理,根据业务逻辑进行相应的处理操作。 4. 数据存储:将处理好的数据进行存储,可以使用数据库或者文件等方式。 下面是一个简单的多线程TCP服务器端程序设计: ```python import socket import threading def handle_client(conn, addr): print("[*] Accepted connection from: %s:%d" % (addr[0], addr[1])) data = conn.recv(1024) response = "Hello client!" conn.send(response.encode()) conn.close() def main(): host = "127.0.0.1" port = 9999 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((host, port)) server_socket.listen(5) print("[*] Listening on %s:%d" % (host, port)) while True: conn, addr = server_socket.accept() client_handler = threading.Thread(target=handle_client, args=(conn, addr)) client_handler.start() if __name__ == "__main__": main() ``` 上面的程序使用了多线程来处理客户端连接请求,每个线程都会调用handle_client函数来处理连接。在handle_client函数中,首先接收客户端发送的数据,然后给客户端发送一个简单的响应,最后关闭连接。 需要注意的是,上面的程序只是一个简单的示例,实际应用中可能需要考虑更多的细节问题,比如线程池的实现、异常处理、数据加密等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值