zoukankan      html  css  js  c++  java
  • python3 多进程、队列、进程池、协程

    多进程

     1 import multiprocessing
     2 import time
     3 
     4 
     5 def demo1():
     6     while True:
     7         print("demo1")
     8         time.sleep(1)
     9 
    10 
    11 def demo2():
    12     while True:
    13         print("demo2")
    14         time.sleep(1)
    15 
    16 
    17 def main():
    18     p1 = multiprocessing.Process(target=demo1)
    19     p2 = multiprocessing.Process(target=demo2)
    20     p1.start()
    21     p2.start()
    22 
    23 
    24 if __name__ == '__main__':
    25     main()

    互斥锁

     1 import threading
     2 import time
     3 
     4 g_num = 0
     5 
     6 
     7 def demo1(num):
     8     global g_num
     9     # 上锁,如果之前没有被上锁,则上锁成功
    10     # 如果上锁之前,已经被锁上,那么会堵塞在这里,直到这个锁被解开为止
    11     mutex.acquire()
    12     for i in range(num):
    13         g_num += 1
    14     # 解锁
    15     mutex.release()
    16     print("%s" % g_num)
    17 
    18 
    19 def demo2(num):
    20     global g_num
    21     mutex.acquire()
    22     for i in range(num):
    23         g_num += 1
    24     # 解锁
    25     mutex.release()
    26     print("%s" % g_num)
    27 
    28 
    29 # 创建一个互斥锁,默认没有上锁
    30 mutex = threading.Lock()
    31 
    32 
    33 def main():
    34     t1 = threading.Thread(target=demo1, args=(1000000,))
    35     t2 = threading.Thread(target=demo2, args=(1000000,))
    36 
    37     t1.start()
    38     t2.start()
    39 
    40     time.sleep(3)
    41     print("%s" % g_num)
    42 
    43 
    44 if __name__ == '__main__':
    45     main()

    队列

     1 import multiprocessing
     2 
     3 
     4 def download_from_web(q):
     5     # 模拟网上下载的数据
     6     data = [1, 2, 3, 4, 5, 6]
     7     for temp in data:
     8         q.put(temp)
     9 
    10 
    11 def analysis_data(q):
    12     # 数据处理
    13     waiting = list()
    14     while True:
    15         data = q.get()
    16         waiting.append(data)
    17         if q.empty():
    18             break
    19 
    20     print(waiting)
    21 
    22 
    23 def main():
    24     # 创建队列
    25     q = multiprocessing.Queue()
    26     p1 = multiprocessing.Process(target=download_from_web, args=(q,))
    27     p2 = multiprocessing.Process(target=analysis_data, args=(q,))
    28 
    29     p1.start()
    30     p2.start()
    31 
    32 
    33 if __name__ == '__main__':
    34     main()

    进程池

     1 from multiprocessing import Pool
     2 import time
     3 import random
     4 import os
     5 
     6 
     7 def worker(msg):
     8     t_start = time.time()
     9     print("%s 开始执行,进程号是 %d" % (msg, os.getpid()))
    10     time.sleep(random.random() * 2)
    11     t_stop = time.time()
    12     print(msg, "执行完毕,耗时%.2f秒" % (t_stop - t_start))
    13 
    14 
    15 if __name__ == '__main__':
    16     # 定义1个进程池,最大进程数为3
    17     po = Pool(3)
    18     for i in range(8):
    19         # 调用目标,传递给目标的参数元组
    20         po.apply_async(worker, (i,))
    21     print("-- start --")
    22     # 关闭进程池,不再接收新的请求
    23     po.close()
    24     # 等待po中所有子进程执行完成,必须放在close语句后面
    25     po.join()
    26     print("-- end --")

    协程

     1 from gevent import monkey
     2 import gevent
     3 import time
     4 
     5 monkey.patch_all()
     6 
     7 
     8 def f1(n):
     9     for i in range(n):
    10         print(gevent.getcurrent(), i)
    11         time.sleep(0.5)
    12 
    13 
    14 def f2(n):
    15     for i in range(n):
    16         print(gevent.getcurrent(), i)
    17         time.sleep(0.5)
    18 
    19 
    20 def f3(n):
    21     for i in range(n):
    22         print(gevent.getcurrent(), i)
    23         time.sleep(0.5)
    24 
    25 
    26 if __name__ == '__main__':
    27     gevent.joinall([
    28         gevent.spawn(f1, 3),
    29         gevent.spawn(f2, 3),
    30         gevent.spawn(f3, 3)
    31     ])

     使用协程下载图片

     1 import gevent
     2 import time
     3 from urllib import request
     4 from gevent import monkey
     5 from numba import jit
     6 
     7 monkey.patch_all()
     8 
     9 
    10 @jit
    11 def cbk(a, b, c):
    12     """ 回调函数
    13     @a:已经下载的数据块
    14     @b:数据块的大小
    15     @c:远程文件的大小
    16     """
    17     per = 100.0 * a * b / c
    18     if per > 100:
    19         per = 100
    20     print('
    下载已经完成 %.2f%%' % per, end="")
    21 
    22 
    23 imgurl = ["https://ww3.sinaimg.cn/mw600/006XNEY7gy1fwj4w6ttb6j30hs0k4tc9.jpg",
    24           "https://ww3.sinaimg.cn/mw600/0073tLPGgy1fx6pxmpwmuj30qo0zkn2x.jpg"]
    25 
    26 headers = [
    27     ("User-agent",
    28      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36")]
    29 
    30 
    31 @jit
    32 def downloader(jpg_name, url):
    33     opener = request.build_opener()
    34     opener.addheaders = headers
    35     request.install_opener(opener)
    36     request.urlretrieve(url, jpg_name, cbk)
    37     time.sleep(0.1)
    38 
    39 
    40 @jit
    41 def main():
    42     time1 = time.time()
    43     gevent.joinall([
    44         gevent.spawn(downloader, "1.jpg", imgurl[0]),
    45         gevent.spawn(downloader, "2.jpg", imgurl[1]),
    46     ])
    47     time2 = time.time()
    48     print(time2 - time1)
    49 
    50 
    51 if __name__ == '__main__':
    52     main()
  • 相关阅读:
    Oracle数据库的备份及恢复策略研讨
    ast入门 (一)
    DisableThreadLibraryCalls
    写入注册表实现自启动
    QT学习1 hello程序
    打印断言函数
    注册表基本知识
    RAS详解
    const
    QT安装
  • 原文地址:https://www.cnblogs.com/ronle/p/10126533.html
Copyright © 2011-2022 走看看