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

该代码示例展示了如何在Python中结合使用进程池和线程池进行并行计算,将SMILES字符串转换为PDB格式。通过RDKit库进行分子处理,利用asyncio实现协程以提高效率,目标是将多个SMILES结构转化为PDB文件。
摘要由CSDN通过智能技术生成

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发呆的比目鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值