for i in A.map(function_name, kwargs_list): print(i.result()) future = A.submit(function_name, (kwargs)) future.result() future.done() future.cancel() task = [A.submit(function_name, (kwargs)) for i in range(20)] wait(task, return_when=FIRST_COMPLETED) for i in as_completed(task): print("result:", i.result()) A = Semaphore(20) B = A.acquire() B.release() A = Condition() A.acquire() A.wait() A.notify() A.release() async def hello(name): print('hello to :', name) return "BBBB" #获取了一个协程对象 c = hello('bobo') #创建一个事件循环对象 loop = asyncio.get_event_loop() #就协程进行进一步的封装,封装到了task对象中 task = [loop.create_future(c) for i in range(100)]
def run_cmd(cmd: Union[str, list], fetch_console=False, workdir: Optional[str] = None, stdout: Optional[Union[str, IO]] = None, stderr: Optional[Union[str, IO]] = None): """ 新开一个进程执行传入的命令 如果fetch_console为True,则可返回命令的标准输出。 如果fetch_console为False, 执行的命令会直接输出到控制台。 :param cmd: 命令行或者命令行列表 :param fetch_console:是否获取命令行输出 :param workdir:是否获取命令行输出 :param stdout:是否获取命令行输出 :param stderr:是否获取命令行输出 :return: 如果指定了fetch_console则返回命令行的标准输出,或者多个命令的标准输出列表,否则返回None """ if cmd is None: return None if workdir is None: workdir = os.curdir if stdout is None: stdout = sys.stdout if stderr is None: stderr = sys.stderr if isinstance(cmd, list): assert len(cmd) != 0 p = ThreadPoolExecutor(len(cmd)) all_task = [ p.submit(run_cmd, c, fetch_console, workdir, stdout, stderr) for c in cmd ] return [future.result() for future in as_completed(all_task)] else: # backup cur = os.getcwd() os.chdir(workdir) if isinstance(stdout, str): stdout = open(stdout, "w+") if isinstance(stderr, str): stderr = open(stderr, "w+") if fetch_console: stdout = os.popen(cmd).read().strip() os.chdir(cur) return stdout else: if workdir is not None: try: p = sp.Popen(cmd, shell=True, stdout=stdout, stderr=stderr) p.wait() success = True except KeyboardInterrupt as e: raise e except OSError or TimeoutError: success = False # Never occur else: success = os.system(cmd) == 0 os.chdir(cur) return success