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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

1回答

5975閲覧

aiohttpでServerを構築したがasyncioによるエラーを吐く

namuyan

総合スコア76

Python 3.x

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

1グッド

0クリップ

投稿2018/05/02 16:27

編集2018/05/03 12:52

Windows10 Python3.5 64bit

python

1from aiohttp import web 2from threading import Thread 3import time 4 5 6def test(request): 7 return web.Response(text='Hello world.') 8 9 10def server(host, port): 11 app = web.Application() 12 app.router.add_get('/', test) 13 web.run_app(app, host=host, port=port) 14 15 16# server("127.0.0.1", 2000) 17Thread( 18 target=server, 19 args=("127.0.0.1", 2000), 20 daemon=True).start() 21 22while True: 23 time.sleep(5) 24 print("Sleeping..zzz") 25

https://github.com/aio-libs/aiohttp

上記のようなコードを用いて、サブスレッド上でWebServerを構築したいと思います。
他にも様々な常駐スレッドを予定していますのでMainThreadは使用しない事になりました。

RuntimeError: There is no current event loop in thread 'Thread-1'.
いつも通りにthreadingモジュールも用いましたが、上記のエラーを受取りました。
asyncioを初めて少ししか経っていない事もありエラーの意味を理解できず解決策がわからず困っています。
どうすればいいのでしょうか?宜しくお願いします。

追記

python

1from aiohttp import web 2import asyncio 3from threading import Thread 4import time 5 6 7def test(request): 8 return web.Response(text='Hello world.') 9 10 11def server(host, port, loop): 12 asyncio.set_event_loop(loop) 13 app = web.Application() 14 app.router.add_get('/', test) 15 web.run_app(app, host=host, port=port) 16 17 18# server("127.0.0.1", 2000) 19loop = asyncio.get_event_loop() 20Thread( 21 target=server, 22 args=("127.0.0.1", 2000, loop), 23 daemon=True).start() 24 25while True: 26 time.sleep(5) 27 print("Sleeping..zzz")

Windowsで動作する事を確認した後、Ubuntuでも動作を確認した所、RuntimeError: set_wakeup_fd only works in main threadとエラーを吐きました。

tachikoma👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

mainスレッド以外はスレッドを生成時にはイベントループに所属していないので、
RuntimeError: There is no current event loop in thread 'Thread-1' , multithreading and asyncio errorを参考にイベントループを生成して渡してください。

Python

1loop = asyncio.get_event_loop()

1,日本語で体系的な資料はほぼなかったような気がしてます。
18.5. asyncio — 非同期 I/O、イベントループ、コルーチンおよびタスク
2,常駐スレッドという言葉で気になりましたが、Python(CPython)にはGlobal Interpreter Lockがあるので、IOを並列化させるのなら問題ないと思いますが、その点留意してくださいな。

投稿2018/05/02 17:11

編集2018/05/02 17:12
umyu

総合スコア5846

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

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

namuyan

2018/05/02 23:40

```python from aiohttp import web import asyncio from threading import Thread import time def test(request): return web.Response(text='Hello world.') def server(host, port, loop): asyncio.set_event_loop(loop) app = web.Application() app.router.add_get('/', test) web.run_app(app, host=host, port=port) # server("127.0.0.1", 2000) loop = asyncio.get_event_loop() Thread( target=server, args=("127.0.0.1", 2000, loop), daemon=True).start() while True: time.sleep(5) print("Sleeping..zzz") ``` 上記のようなコードに変更した所、目的の動作をさせる事ができました。 ただし、このコードが安全なのかまだよくわからないまま使うので心配は大きいですが
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問