質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2041閲覧

docker上でflaskサーバ起動時にスレッドを走らせたい

mohimohi98k

総合スコア13

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/03/14 06:12

編集2019/03/15 00:44

したいこと

Docker上でFlaskサーバの起動時に、スレッドで定刻になったら処理が走る関数を動かしたいです。

ソース

run.py import schedule def test_schedule(): schedule.every().day.at("00:00").do(呼び出したい関数) while True: schedule.run_pending() time.sleep(3600) #1時間に1回くらいチェックして0時になったら実行してほしい if __name__ == '__main__': thread_1 = threading.Thread(target=test_schedule) thread_1.start() app.run()

上記のように記載しているのですが、
docker-compose up -d 以降、この関数は一度も呼ばれないです。
時間を今現在にしてみたり、time.sleepの時間を短くしてみましたがダメでした。

エラーが出ているわけではなく、単純にこのスレッド関数が動いていないようなので
どう書けば実行してくれるのか、ご存知の方ご教示いただきたいです。

試したこと

こちらの内容も試してみましたが、
スレッドではないので一度起動してしまうと、定刻になるまで他の処理が動かない状態になっていました。

https://zhuanlan.zhihu.com/p/26415908

追記

そもそもの話ですが、

if __name__ == '__main__': thread_1 = threading.Thread(target=test_schedule) thread_1.start() app.run()

この表記で、thread_1.start()は呼ばれるのでしょうか。
この状態だと、run.pyが呼ばれてサーバが立つ前に関数が動きはじめて、
それに続くようにサーバが立ち上がるとの認識で記述していましたが、その認識で間違いはないでしょうか。
(今動かないのはDocker上のみで、ローカルでpython run.pyで起動するとスケジュールは正しく呼ばれます)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2019/03/14 06:35

コードのコピーに失敗しているのでは
mohimohi98k

2019/03/14 06:44

ご回答ありがとうございます。 どの部分がコピー失敗しているように見受けられたでしょうか。
mohimohi98k

2019/03/14 06:46

あ、defの部分ですかね?修正いたします。
quickquip

2019/03/14 07:15 編集

すみません。「実際に動かしているのではないコードを例として貼っていないでしょうか」と書くべきでした。この関数の名前がscheduleなはずはないと思ったので。
mohimohi98k

2019/03/14 07:31 編集

あ、なるほど。 はいそうです、構成はまったく同じですが、scaduleは実際の関数名ではありません。(実際はこれに別の文字列をプラスしております) 業務で使用予定でしたのでとっさにプラスしてあった文字を決して投稿していました。ライブラリと同じ名前で誤解を招いて申し訳ないです。
quickquip

2019/03/14 07:37

そうですよね。慌てて回答をしなくてよかったです。関数名は編集していただくのがいいかと思いました。
mohimohi98k

2019/03/14 07:38

ありがとうございます。修正させていただきました。
t_obara

2019/03/14 10:36

scheduleモジュールの使い方についてドキュメントに目を通しましたか?sleepとschedule.everyで指定するパラメータとの間にどのような関係があるのか今一度把握されてみてはいかがでしょうか。
mohimohi98k

2019/03/15 00:27 編集

ありがとうございます。 こちらリファレンスは何度か目を通しましたが、 schedule.every.day.atは1日のうちの特定の時刻、 time.sleepはsecで指定した秒数の間動作を停止する、と認識しております。 まだ何か見落としがありますでしょうか。 どのような関係、というご回答の意図が見えない未熟者ゆえ、 ご教示いただきたく思います。
guest

回答1

0

自己解決

一番やりたいことに近いことを見つけました。
https://stackoverflow.com/questions/51931262/threading-in-flask-not-working-with-uwsgi-but-working-on-commandline

恐らく設定ファイルの編集が必要かと思うので、ちょっと調べながら作業をしてみようと思います。
また何かありましたら質問させていただきます。
みなさまのご意見ありがとうございました。

投稿2019/03/15 01:51

mohimohi98k

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問