2017-01-08 4 views
1

私はblastnスクリプトのWebインターフェイスであるWeb2Py Webアプリケーションを持っています。Web2PyのWebユーザ間でデータベースなしで変数を共有する方法

明らか
available_worker = multiprocessing.cpu_count() - 1 

def get_workers(): 
    global available_worker 
    return available_worker 

def consume_worker(): 
    global available_worker 
    available_worker = available_worker - 1 

def free_worker(): 
    global available_worker 
    available_worker = available_worker + 1 

def index(): 
    if get_workers() > 0: 
     consume_worker() 
     # run a script 
     free_worker() 
    print get_workers() 

、それは毎回のように動作しません:Webアプリケーションが起動すると今、私は、私の考えは、

で、同時に実行中のプロセスを制限するために、私は、default.pyになかった方法が必要ですウェブがロードされると、available_workerがmultiprocessing.cpu_count() - 1にリセットされます。

ウェブセッションやユーザー間でavailabe_workerを共有できる方法があるかどうかは疑問です。

ユーザーAがページを読み込むまでには、available_workerは2で、スクリプトを実行します。ユーザAがスクリプトを実行している間に、ユーザBがwebappをロードし、available_workerが1になり、スクリプトを実行します。 AとBがスクリプトを実行しているときにユーザCが来ると、available_workerは0なので、スクリプトを実行する前にAまたはBのどちらかが終了するまで待たなければなりません。

私はプログラミングに新しいです、詳細な説明とサンプルコードは非常に高く評価されます。

ありがとうございます。

編集:私はちょうど私の実際の質問を実現

で、web2pyのアプリを起動したときに、初めてのweb2pyの起動時にのみinitedされる変数を、initにする方法について説明します。その後、セッション/使用は変数値を更新できます。私のコードの問題は、ページがロードされるたびに、データベースにデータを保存しても、値がmultiprocessing.cpu_count() - 1にリセットされることになります。同じ結果になります。

+0

永続データを扱うのはデータベース全体のポイントなので、使用しない理由は何ですか? –

+0

私の上司はデータベースがまったく欲しいとは思っていません。私は実際にweb2pyアプリケーションを起動するときに、web2pyをはじめて起動したときにのみ起動される変数をどのように初期化するのかということに気付きました。その後、セッション/使用は変数値を更新できます。私のコードの問題は、ページがロードされるたびに、データをデータベースに格納しても、値が 'multiprocessing.cpu_count() - 1'にリセットされ、同じ結果になることがわかりました。 –

答えて

0

データベースは、正しく使用すると問題を解決します。すべての関数は、DBから値を読み取り、その値を更新します。 DBの値が初期化されていない場合は、現在のコードと同じように初期化します。

DBを使用できない場合は、おそらく外部テキストファイルが使用します。

実装方法:現在のコードでavailable_workerの値にアクセスする場合は、外部リソースから取得します。それを変更するたびに、その外部リソースを更新します。

このリソースをサーバが起動するたびに(再)初期化するには、個々のアプリの外に出なければなりません。たとえば、サーバを実際に起動するのは、gluon.widget.pyを変更することができます。

パラメータを持たないweb2pyコントローラの関数はすべてWebページとしてアクセスできるため、worker関数も同様に機能することができます。 。

+0

ありがとうございます。私の問題は、 'multiprocessing.cpu_count() - 1'を読んで、アプリケーションを初めて起動したときにのみファイルシステムに書き込むコードをどこに置くべきかわかりません。そして、次の使用のためにファイルに書き込むより変数を取得するためにファイルから読み込みます。あなたは助けてもらえますか? –

+0

私はdefault.pyの先頭にコードを追加することでそれを試みました。しかし、新しいユーザーがサイトを訪れるたびに(または単にページを更新するたびに)、3つのジョブが実行中であっても、カウントは 'multiprocessing.cpu_count()-1 'にリセットされます。 –

+0

私は正しく説明していないと思います。私は最初にファイルに書き込むことでこれを行うことができます。ファイルが存在する場合、 'multiprocessing.cpu_count() - 1'ではなく、ファイルから値を読み取るだけです。ただし、サーバーが再起動しても、レコードはdb /ファイルシステムのいずれかに存在します。しかし、その時点で、利用可能なワーカーは 'multiprocessing.cpu_count() - 1'でなければなりませんが、ファイル内では0になります。スクリプトは決して実行されません。ですから、web2pyのどこかにコードを追加する必要があります。このコードは、サーバーが最初に起動するときにのみ実行されます。私はそれを行うことができますか? –

0

おそらくPython Multiprocessing libraryを見てください。

+0

何らかの理由で、マルチプロセッシングは私のアプリケーションのオプションではありません。 –

0

いくつかのデータをユーザー間でグローバルに共有する必要がある場合は、web2py cache機能を使用できます。 web2pyを1つのプロセスで実行している場合は、単にcache.ramを使用することもできます(変数をモジュールの最上位に置き、インポートすることもできます)。それ以外の場合は、cache.diskまたはcache.redisを使用します。他の人が示唆しているように、単にデータベースを使用することもできます。

代わりに、web2pyに組み込まれているschedulerでこれを処理することもできます。スケジューラーワーカーは、必要な数だけ起動できます。これにより、実行可能な同時タスクの数が制限されます。

関連する問題