一度に二つのことをしたいときはいつでも、あなたは同時実行を必要としています。 Pythonはいくつかのオプションが内蔵され、一度にいくつかのことを行うために持っている:これは時々協調的マルチタスクと呼ばれる
使用コルーチン
。並行性はすべてメインスレッドで達成されます。定期的瞬間に保持するために、一人一人を尋ねることによって、1人の電話上の人物と別の人物対面して、2人の会話に運ぶと似ています
import asyncio
class First:
async def one(self):
while True:
print('here is 1')
await asyncio.sleep(0)
class Second:
async def two(self):
while True:
print('here is 2')
await asyncio.sleep(0)
class SuperNumber(First, Second):
pass
foo = SuperNumber()
one = foo.one()
two = foo.two()
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(one, two))
。スレッド
これは、複数のスレッドを使用していますが、それでも1つのCPUのみを使用して
。 GILのリリースから利益を得ることができる状況に最適です。 IOバウンドアプリケーション。あなたは夕食を調理しているときに似ていて、あなたがストーブの上に水を入れ、その後、あなたは水が沸騰するためにあなたが待っている間、いくつかの野菜を切り刻む
from concurrent.futures import ThreadPoolExecutor
class First:
def one(self):
while True:
print('here is 1')
class Second:
def two(self):
while True:
print('here is 2')
class SuperNumber(First, Second):
pass
foo = SuperNumber()
with ThreadPoolExecutor(max_workers=2) as executor:
executor.submit(foo.one)
executor.submit(foo.two)
。それはストーブ[カーネル]の仕事なので、[ユーザー]はただそこに座って水が沸騰するのを見る必要がないので、その間に自分自身を有効にすることもできます。
これは、複数のCPUを使用し、真の並列処理を達成することができますここでの唯一の解決策があるので、このアプローチは、一般的にCPUにバインドされたアプリケーションのための最高の一つであり、マルチプロセッシング使用
。コードはスレッド化の例とまったく同じですが、別のエグゼキュータ・クラスを使用するだけです。それは最もオーバーヘッドがあります。プロセスごとにPythonインタプリタが必要なので、複数のタスクまで拡張するのにはコストがかかります。
from concurrent.futures import ProcessPoolExecutor
class First:
def one(self):
while True:
print('here is 1')
class Second:
def two(self):
while True:
print('here is 2')
class SuperNumber(First, Second):
pass
foo = SuperNumber()
with ProcessPoolExecutor(max_workers=2) as executor:
executor.submit(foo.one)
executor.submit(foo.two)
これは、野菜をチョップしている間、野菜を切り刻むのに役立つキッチンハンドを雇うのに似ています。あなたは別のナイフとチョッピングボードを購入しなければなりませんが、半分の時間にこのようにジャガイモを切ることができるはずです。
出典
2017-09-15 19:57:06
wim
別のスレッドでそれぞれのメソッドを実行してください。 – ingvar
私を見せてもらえますか? –
'test2'と' test4'は何ですか? – wim