python3 进程池版的socket并发聊天

Pool内的进程数默认是cpu核数,假设为4(查看方法os.cpu_count())开启6个客户端,会发现2个客户端处于等待状态在每个进程内查看pid,会发现pid使用为4个,即多个客户端公用4个进程tcp_server.py
# coding:utf-8
import os
import socket
from multiprocessing import Pool

def tcpserver(conn):
    while 1:
        from_client_msg = conn.recv(1024)
        if not from_client_msg: break
        print("[%s]来自客户端的消息:" % os.getpid(), from_client_msg)
        conn.send(from_client_msg.upper())

if __name__ == ‘__main__‘:
    server = socket.socket()
    ip_port = ("127.0.0.1", 8001)
    server.bind(ip_port)
    server.listen(5)
    pool = Pool(os.cpu_count())
    print("pool count:", os.cpu_count())
    while 1:
        conn, addr = server.accept()
        res = pool.apply_async(tcpserver, args=(conn,))
    pool.close()
    pool.join()

tcp_client.py

# coding:utf-8
import socket

if __name__ == ‘__main__‘:
    client = socket.socket()
    ip_port = ("127.0.0.1", 8001)
    client.connect(ip_port)
    while 1:
        inp = input(">>>>:").strip()
        if not inp: continue
        client.send(inp.encode("utf-8"))
        from_server_msg = client.recv(1024)
        print("来自服务端的消息:", from_server_msg)

发现:并发开启多个客户端,服务端同一时间只有4个不同的pid,只能结束一个客户端,另外一个客户端才会进来.

 

原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10986698.html

时间: 2024-08-29 22:39:55

python3 进程池版的socket并发聊天的相关文章

python3 进程池

进程池无IO堵塞的情况 # coding:utf-8 import time from multiprocessing import Process, Pool def func(n): pass if __name__ == '__main__': num = 10 start_pool_time = time.time() pool = Pool(5) pool.map(func, range(num)) # map是异步执行的,并且自带close和join print("通过进程池执行的时

python3 进程池回调函数

# coding:utf-8 import os from multiprocessing import Pool def func1(n): print("func1[%s]" % os.getpid()) return n*n def func2(m): print("func2[%s] 接收到的参数是:" % os.getpid(), m) if __name__ == '__main__': print("主进程[%s]" % os.ge

一个简单的进程池版的爬虫程序

# http://www.doutula.com/article/list/?page=1 第一页 # http://www.doutula.com/article/list/?page=2 翻页 # <a href="http://www.doutula.com/article/detail/1535518" class="list-group-item random_list"> # # 首页中具体包链接 # <img src="ht

45_并发编程-进程池

一.为什么引入进程池 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁进程(空间,变量,文件信息等等的内容)也需要消耗时间.第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,维护一个很大的进程列表的同时,调度的时候,还需要进行切换并且记录每个进程的执行节点,也就是记录上下文(各种变量等等乱七八糟的东西,虽然你看不到,但是操作系统都要做),这样反而会影

铁乐学python_Day40_进程池

进程之间的数据共享 基于消息传递的并发编程是大势所趋, 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据. 这样极大地减少了对使用锁和其他同步手段的需求,还可以扩展到分布式系统中. 但进程间应该尽量避免通信,即便需要通信,也应该选择进程安全的工具来避免加锁带来的问题. 以后我们会尝试使用数据库来解决现在进程之间的数据共享问题. 进程间数据是独立的,可以借助于队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以通过Manager实现数据共享,事实

Python程序中的进程操作-进程池(multiprocess.Pool)

Python程序中的进程操作-进程池(multiprocess.Pool) 一.进程池 为什么要有进程池?进程池的概念. 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁进程也需要消耗时间.第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,这样反而会影响程序的效率.因此我们不能无限制的根据任务开启或者结束进程.那么我们要怎么做呢? 在这里,要给大家介

Python 进程池

一.定义: 多进程是实现并发的手段之一,在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.                  Pool([numprocess [,initializer [, initargs]]]):创建进程池 二.主要参数: 1 numprocess:要创建的进程数,如果省略,将默认使用cpu_count()的值 2 initializer:是每个工作进程启动时要执行的可调用对象,默认为None 3 init

半同步/半异步并发模式进程池实现

半同步/半异步并发模式:父进程监听到新的客户端连接请求后,以通信管道通知进程池中的某一子进程:"嘿,有新的客户连接来了,你去accept,然后处理下!",从而避免在进程间传递文件描述符.这种模式中,一个客户连接上的所有任务始终有同一个进程来处理. 具体细节,尽在代码中: #ifndef PROCESSPOOL_H #define PROCESSPOOL_H #include <sys/types.h> #include <sys/socket.h> #inclu

27 Apr 18 GIL 多进程多线程使用场景 线程互斥锁与GIL对比 基于多线程实现并发的套接字通信 进程池与线程池 同步、异步、阻塞、非阻塞

27 Apr 18 一.全局解释器锁 (GIL) 运行test.py的流程: a.将python解释器的代码从硬盘读入内存 b.将test.py的代码从硬盘读入内存  (一个进程内装有两份代码) c.将test.py中的代码像字符串一样读入python解释器中解析执行 1 .GIL:全局解释器锁 (CPython解释器的特性) In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple na