python 进程 线程和协程同时使用并行计算

python 进程 线程和协程同时使用并行计算

#########################################################################
#
# ################# 需求:进程中添加线程, 线程中添加协程
# ################# 将smile分别转为PDB格式
#
#########################################################################
import time
from concurrent.futures import ProcessPoolExecutor, wait, ThreadPoolExecutor
from rdkit import Chem
from rdkit.Chem import AllChem
import asyncio

async def mol_to_pdb(smile):
    mol = Chem.MolFromSmiles(smile)
    Chem.AddHs(mol)
    AllChem.EmbedMolecule(mol, randomSeed=3)
    AllChem.MMFFOptimizeMolecule(mol)
    return mol
async def save_path(smile, save_path):
    mol = await  mol_to_pdb(smile)
    writer = Chem.PDBWriter(save_path)
    writer.write(mol)
    writer.close()
    
def run(smile, save_dir):
    asyncio.run(save_path(smile, save_dir))

def task(smile:str):
    try:
        with ThreadPoolExecutor() as poolExecutor:
            pfutures = [poolExecutor.submit(run, smile=s[0], save_dir=s[1]) for s in smile]
        return 1
    except:
        return 0

with ProcessPoolExecutor(max_workers=5) as executor:
    smiles = [("c1cc(O)cc2CC[C@@H]3[C@@H](c12)CC[C@]1([C@H]3CC[C@@H]1O)C", "/DYZ/dyz1/virtual_screening/tests/1.pdb"), 
              ("c1cc(O)cc2CC[C@@H]3[C@@H](c12)CC[C@]1([C@H]3CC[C@@H]1O)C", "/DYZ/dyz1/virtual_screening/tests/2.pdb"),
              ("c1cc(O)cc2CC[C@@H]3[C@@H](c12)CC[C@]1([C@H]3CC[C@@H]1O)C", "/DYZ/dyz1/virtual_screening/tests/3.pdb"),
              ("c1cc(O)cc2CC[C@@H]3[C@@H](c12)CC[C@]1([C@H]3CC[C@@H]1O)C", "/DYZ/dyz1/virtual_screening/tests/4.pdb"),
              ("c1cc(O)cc2CC[C@@H]3[C@@H](c12)CC[C@]1([C@H]3CC[C@@H]1O)C", "/DYZ/dyz1/virtual_screening/tests/5.pdb"),
              ("c1cc(O)cc2CC[C@@H]3[C@@H](c12)CC[C@]1([C@H]3CC[C@@H]1O)C", "/DYZ/dyz1/virtual_screening/tests/6.pdb"),
              ("c1cc(O)cc2CC[C@@H]3[C@@H](c12)CC[C@]1([C@H]3CC[C@@H]1O)C", "/DYZ/dyz1/virtual_screening/tests/7.pdb"),
              ("c1cc(O)cc2CC[C@@H]3[C@@H](c12)CC[C@]1([C@H]3CC[C@@H]1O)C", "/DYZ/dyz1/virtual_screening/tests/8.pdb"),
              ("c1cc(O)cc2CC[C@@H]3[C@@H](c12)CC[C@]1([C@H]3CC[C@@H]1O)C", "/DYZ/dyz1/virtual_screening/tests/9.pdb"),
              ("c1cc(O)cc2CC[C@@H]3[C@@H](c12)CC[C@]1([C@H]3CC[C@@H]1O)C", "/DYZ/dyz1/virtual_screening/tests/10.pdb")]
    
    futures = []
    start = 0
    for i in range(5):
        futures.append(executor.submit(task, smile=smiles[start:start+2]))
        start += 2
    print(wait(futures, timeout=6)) ## 等待6分钟,显示future是否完成
    for future in futures:
        ret = future.result()
        print('result is %s' % str(ret))
    executor.shutdown()

猜你喜欢

转载自blog.csdn.net/weixin_42486623/article/details/129920091