python 进程 线程和协程同时使用并行计算
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))
for future in futures:
ret = future.result()
print('result is %s' % str(ret))
executor.shutdown()