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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

213閲覧

さくらのクラウドAPI「saklient」を非同期で実行したい

tap10ka

総合スコア6

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/10/25 04:02

saklientを使って一括でアーカイブからサーバを大量に作成したいと思っております。
asyncioを使って非同期に実行しようとしましたが、同期的になってしまいます。
ご教授の方をお願いいたします。

以下が実際のコードです。

非同期的コード

python

1import time 2import asyncio 3 4from saklient.cloud.api import API 5 6@asyncio.coroutine 7def create_server(number): 8 print('start'+str(number)) 9 yield from asyncio.sleep(1) 10 token = 'XXXX' 11 secret = 'XXXXXXXXXXX' 12 zone = 'tk1a' 13 api = API.authorize(token, secret, zone) 14 15 archives = api.archive \ 16 .with_name_like('archive') \ 17 .with_size_gib(20) \ 18 .limit(1) \ 19 .find() 20 archive = archives[0] 21 22 disk = api.disk.create() 23 disk.name = 'test-disk-%03d'%number 24 disk.source = archive 25 disk.plan = api.product.disk.ssd 26 disk.save() 27 28 server = api.server.create() 29 server.name = 'test-%03d'%number 30 server.plan = api.product.server.get_by_spec(1, 1) 31 server.save() 32 33 iface = server.add_iface() 34 iface.connect_to_shared_segment() 35 36 # wait disk copy 37 print('waiting disk copy') 38 if not disk.sleep_while_copying(): 39 raise Exception('failed') 40 41 diskconf = disk.create_config() 42 diskconf.host_name = "test-host-%03d"%number 43 diskconf.write() 44 45 print('connecting the disk') 46 disk.connect_to(server) 47 48 # boot 49 print('booting the server') 50 server.boot() 51 52 # stop 53 #yield from asyncio.sleep(1) 54 print('stopping the server') 55 server.stop() 56 if not server.sleep_until_down(): 57 raise(Exception('failed')) 58 59 60if __name__ == "__main__": 61 units = 4 62 loop = asyncio.get_event_loop() 63 tasks = [asyncio.ensure_future(create_server(i)) for i in range(1,units+1)] 64 loop.run_until_complete(asyncio.wait(tasks)) 65 loop.close() 66 67

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

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

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

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

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

guest

回答1

0

saklientは内部でurllibを使っているようなので、そこで同期処理になってしまっているようです。asyncioの代わりにconcurrent.futures.ThreadPoolExecutorで並列処理化してはいかがでしょうか。

https://docs.python.jp/3/library/concurrent.futures.html

投稿2017/10/25 04:24

YouheiSakurai

総合スコア6142

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問