zoukankan      html  css  js  c++  java
  • Python-并发-多线程-多进程

    多线程

    多线程写入到一个文件内
    实现方式: 采用 concurrent 和 threading.lock 锁的方式 
               采用threading 模块和 queue的方式
    		   
     方案01
       Executor.submit(fn, *args, **kwargs)
        submit返回一个Future对象。
    	    其中future.result()的 
    	    result方法的作用是拿到调用返回的结果。如果没有执行完毕就会去等待。
    	    这里我们使用with操作符,
    	      使得当任务执行完成之后,自动执行shutdown函数,而无需编写相关释放代码
        Executor.map(fn, *args, **kwargs)
         map(func, *iterables, timeout=None)  iterables:可以是一个能迭代的对象. 
      回调函数		 
    

    代码示例

    from concurrent.futures import ThreadPoolExecutor, as_completed
    from threading import Lock
    import random
    from time import time
    
    
    def judge_interval(n):
        """ # 多输入参数时,可以将输入组装成list,嵌套的list的方式提取输入参数 """
        if n > 25:
            raise Exception('Big> 25, now %s 
    ' % n)
        elif 10 <= n <= 25:
            return n*1000
        else:
            return -n
    
    
    def multi_thread(input_nums, input_file):
        """ 多线程写入到一个文件内"""
        lock = Lock()
        with open(input_file, 'a') as input_file_obj:
            with ThreadPoolExecutor(max_workers=3) as executor:
                future_jobs = {executor.submit(judge_interval, num): num for num in input_nums}
                for job in as_completed(future_jobs):
                    try:
                        # result() 方法可以获取任务的返回值
                        data = job.result()
                        # 获取程序的输入
                        data_input = future_jobs[job]
                        print(data_input, data)
                        with lock:
                            input_file_obj.write('input: %s  output: %s.
    ' % (data_input, data))
                    except Exception as e:
                        input_file_obj.write(str(e))
    
    
    if __name__ == '__main__':
        start_time = time()
        log_file = r'C:Usersowout.txt'
        nums = [random.randint(0, 40) for _ in range(0, 5)]
        multi_thread(nums, log_file)
        end_time = time()
        duration_time = (end_time-start_time)
        print(f"用时 {duration_time}秒")
    

    多线程操作

    多线程计算-代码示例
    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    import threading
    
    def my_func(num):
        return print('my_func calldeb by thread {}'.format(num))
    
    def main():
        record =[]
    	for i in range(10):
    	     t = threading.Thread(target=my_func, args=(i,))
    		 record.append(t)
    		 t.start()
    		 t.join()
    if __name__ =="__main__"
         main()
    

    多进程操作

    多进程调用shell
    import os
    import sys
    import multiprocessing
    
    def process(n,cmd):
        print("Porcess num {} cmd={}".format(n,cmd))
        os.subprocess(cmd,shell=True)
    def multi_process(file_list,i, cmd):
        record  = []
        process_num = len(file_list)
        for i in range(process_num):
            cmd = "touch " + file_list[i]
            p = multiprocessing.Process(target=process, args=(i, cmd))
            p.start()
            record.append(p)
        for p in record:
            p.join()
    
    if __name__ == "__main__":
        file_list = ["a1.txt",'b1.txt','c1.txt','d.txt']
        multi_process(file_list,i, cmd)
    

    参考

    详解python中的Lock与RLock https://blog.csdn.net/lgyfhk/article/details/105254079
    https://www.zhihu.com/question/37732728/answer/1079020249
  • 相关阅读:
    AppCan打包问题
    Layui数据表格模型
    Layui关闭弹出层并刷新父窗口
    spring boot重启后图片不见
    MySQL数据库创建时间和更新时间错乱问题
    Spring Boot解决无法访问图片的问题
    Spring Boot解决无法访问图片的问题
    reload() 方法用于重新加载当前文档。配合Ajax异步请求。
    Layui数据表格的接口数据请求方式为Get
    时间格式注解
  • 原文地址:https://www.cnblogs.com/ytwang/p/15045518.html
Copyright © 2011-2022 走看看