zoukankan      html  css  js  c++  java
  • Python 多进程和多线程

    Python中的多进程

    Process 逐个创建进程

    使用multiprocessing 中的Process,其中start()代表启动进程,join()代表等待进程结束再执行后面代码程序。

    from multiprocessing import Process
    from time import time,sleep
    
    def func(arg):
          time.sleep(6)
          return arg
    
    def main():
          start = time()
          p1 = Process(target=func,args=('123',))
          p1.start()
          p2 = Process(target=func,args=('456',))
          p2.start()
          p1.join()
          p2.join()
          end = time()
          print('总共耗费了%.2f秒.' % (end - start))
    
    if __name__ == '__main__':
          main()
    

    在创建进程时,子进程复制了父进程及其所有的数据结构,每个子进程有独立的内存空间,所以子进程间不共享变量。

    Pool 创建指定数量的进程

    Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。

    使用multiprocessing 中的Pool,其中imap()代表函数参数映射,join()代表等待进程结束再执行后面代码程序。

    import time
    from multiprocessing import Pool
    
    def run(fn):
        time.sleep(1)
        print(fn * fn)
    
    
    if __name__ == "__main__":
        testFL = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        
        # 进程池数目
        num_pools = 3
        pool = Pool(num_pools)
        
        # testFL:要处理的数据列表,run:处理testFL列表中数据的函数
        pool.imap(run, testFL)
        # pool.imap_unordered(run, testFL) 随机顺序
        pool.close()  # 关闭进程池,不再接受新的进程
        pool.join()  # 主进程阻塞等待子进程的退出
    

    Python中的多线程

    使用threading中的Thread线程,其中start()代表启动进程,join()代表等待线程结束再执行后面代码程序。

    使用threading中的Lock锁,其中acquire()代表先获取锁才能执行后续,release()代表等待线程结束再执行后面代码程序。

    # Python中的多线程
    
    from threading import Thread,Lock
    import time
    
    class wallet:
        def __init__(self,money):
            self.money = money
            self._lock = Lock()# 通过“锁”来保护“临界资源”
        @property
        def _money(self):
            return self.money
        def dp(self):
            self._lock.acquire()
            x = self.money - 1
            time.sleep(0.01) # 延迟时间
            self.money = x
            self._lock.release()
    
    class deposit(Thread):
        def __init__(self,wt):
            super().__init__()
            self.wt = wt
        def run(self):# 线程执行函数run
            self.wt.dp()
    
    def main():
        wt = wallet(100)
        threads = []
        for i in range(100):
            t = deposit(wt)
            threads.append(t)
            t.start()
        for t in threads:
            t.join()
        print("balance: ",wt.money)
    if __name__ == '__main__':
          main()
    
  • 相关阅读:
    【洛谷P2967】【USACO 2009 Dec】电子游戏 Video Game Troubles
    2021-09-11 刷题 39. 组合总和
    2021-09-10 刷题 160. 相交链表
    2021-09-09 刷题 141. 环形链表
    2021-09-08 刷题 20. 有效的括号
    2021-09-07 刷题 119杨辉三角2
    2021-08-01 刷题 合并两个有序链表
    2021-07-31 leetcode刷题记录 两数之和
    根据需要数据库的内容,封装增删改查的sql函数
    QT 对XML 文件进行增删改查
  • 原文地址:https://www.cnblogs.com/linzhenyu/p/13253948.html
Copyright © 2011-2022 走看看