美文网首页
使用池来实现并发服务器

使用池来实现并发服务器

作者: 栈先生 | 来源:发表于2019-10-26 22:46 被阅读0次

    python自带池

    进程池和线程池创建用的是同一个模块(multiprocessing),但方法不同,进程池的方法是Pool,线程池的方法是pool.ThreadPool。不管是进程池还是线程池,它们都是默认开启守护模式的。下面以进程池为例:

    实例化:pool = Pool(num),num是开启进程的数量。
    提交任务:pool.apply_async(func[,args = (),kwds = {}])
    关闭:pool.close(),关闭后就禁止再提交任务。
    join等待:pool.join(),只要队列计数器不为0,就一直阻塞。
    中止进程:pool.terminate():中止进程池,中止所有任务。
    multiprocessing.cpu_count()可以返回cpu数

    任务函数的返回值怎么获取?

    通过变量接收:async_esult = pool.apply_async(func) ,再用get方法获取返回值:result = async_esult.get()。这个方法get会阻塞,又返回结果就解阻塞。

    下面是利用线程池来实现简单的操作

    from multiprocessing.pool import ThreadPool
    if __name__ == '__main__':
        def func1(*args,**kwargs)
            print("这是任务一")
            return "hello"
        def func2(*args,**kwargs):
            print("这是任务二")
        p = ThreadPool(2)
        a = p.apply_async(func1) #获取任务返回值
        print(a.get())
        p.apply_async(func2)
        a = p.apply_async(func1) #获取任务返回值
        print(a.get())
        p.apply_async(func2)
        p.close()
        p.join()
    
    这是任务一
    hello
    这是任务二
    这是任务一
    hello
    这是任务二
    使用池来实现并发服务器
    
    from multiprocessing.pool import ThreadPool
    import socket
    if __name__ == '__main__':
        server = socket.socket()
        server.bind(('127.0.0.5',8899))
        server.listen(20)
        p = ThreadPool(20)
        def recv(coon,addr):
            while True:
                data = coon.recv(1024)
                if data:
                    print("收到来自{}的信息:{}".format(addr,data.decode()))
                    coon.send("已收到信息:%s"%data)
                else:
                    coon.close()
                    break
        while True:
            coon,addr = server.accept() #有一个连接过来就交给一个线程去执行
            p.apply_async(recv,args=(coon,addr))
     
    

    相关文章

      网友评论

          本文标题:使用池来实现并发服务器

          本文链接:https://www.haomeiwen.com/subject/xoouvctx.html