美文网首页程序员
并发——Python篇

并发——Python篇

作者: zhazhami | 来源:发表于2016-11-18 13:26 被阅读71次

    ** 以下代码均在Python3.5下测试 **

    1. 多线程

    threading模块实现

    import threading, time
    
    class Worker(threading.Thread):
        def __init__(self, num):
            super(Worker,self).__init__()
            self.num = num
        def run(self):
            print("Thread-%d start..." % self.num)
            time.sleep(1)
            print("Thread-%d end..." % self.num)
    
    workers = []
    n = 5
    st = time.time()
    for i in range(n):
        workers.append(Worker(i))
    for i in range(n):
        workers[i].start()
    for i in range(n):
        workers[i].join()
    et = time.time()
    print("cost %.3fs" % (et-st))
    

    map实现

    from multiprocessing.dummy import Pool
    from urllib import request as rq
    
    urls = []
    for i in range(100):
        urls.append("http://acm.split.hdu.edu.cn/showproblem.php?pid=%d" % (1000+i))
    
    pool = Pool(5)
    pool.map(rq.urlopen, urls)
    pool.close()
    pool.join()
    

    2. 多进程

    import multiprocessing, time
    
    class Worker(multiprocessing.Process):
        def __init__(self, num):
            super(Worker,self).__init__()
            self.num = num
        def run(self):
            print("Process-%d start..." % self.num)
            time.sleep(1)
            print("Process-%d end..." % self.num)
    
    #这句必须写
    if __name__ == '__main__':
        workers = []
        n = 5
        st = time.time()
        for i in range(n):
            workers.append(Worker(i))
        for i in range(n):
            workers[i].start()
        for i in range(n):
            workers[i].join()
        et = time.time()
        print("cost %.3fs" % (et-st))
    

    3. 协程

    gevent实现

    import gevent
    from gevent import monkey
    from urllib import request as rq
    monkey.patch_socket()
    
    urls = []
    for i in range(100):
        urls.append("http://acm.split.hdu.edu.cn/showproblem.php?pid=%d" % (1000+i))
    
    def worker(i):
        rq.urlopen(urls[i])
    
    tasks = [gevent.spawn(worker, i) for i in range(100)]
    gevent.joinall(tasks)
    

    async/await实现

    import asyncio
    
    async def worker():
        await asyncio.sleep(1)
    
    loop = asyncio.get_event_loop()
    tasks = [worker() for _ in range(20)]
    loop.run_until_complete(asyncio.wait(tasks))
    loop.close()
    

    相关文章

      网友评论

        本文标题:并发——Python篇

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