2017-09-15 9 views
1

私は永遠に続くループを持つ2つのクラスを持っています。スーパーを作成するときに、クラスを取得できません.Firstもループして実行されます。ここにいくつかのsudoのコードがあります。私はそれらの両方を実行する方法が失われており、同時に実行する必要があります。無限ループの2つのクラスを実行する

class First: 
    def one(self): 
     for test1 in test2: 
      # go on forever 
      print('here is 2') 


class Second: 
    def two(self): 
     for test3 in test4: 
      # go on forever 
      print('here is 2') 


class SuperNumber(First, Second): 
    pass 


Foo = SuperNumber() 
Foo.one() 
Foo.two() 
+1

別のスレッドでそれぞれのメソッドを実行してください。 – ingvar

+0

私を見せてもらえますか? –

+0

'test2'と' test4'は何ですか? – wim

答えて

6

一度に二つのことをしたいときはいつでも、あなたは同時実行を必要としています。 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) 

これは、野菜をチョップしている間、野菜を切り刻むのに役立つキッチンハンドを雇うのに似ています。あなたは別のナイフとチョッピングボードを購入しなければなりませんが、半分の時間にこのようにジャガイモを切ることができるはずです。

関連する問題