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

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

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

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

Q&A

解決済

1回答

516閲覧

vscode上でpythonのmultiprocessingのコード補完がされない

Pirekatsu

総合スコア9

Python 3.x

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

0グッド

0クリップ

投稿2022/12/07 04:59

編集2022/12/07 06:21

導入している拡張機能

IntelliCode
isort
Path Intellisense
Pylance
Python
Python Indent

実現したいこと

下の画像において、decodeappendが白くなっています。ここをmultiprocessingを使わないときのように色付けたいです。なお、この状態でもコード自体は正常に動きます(例えばappendの場合、しっかり追加される)。multiprocessingを利用するときは特別な拡張機能、またはjsonファイルなどをいじる必要があるのでしょうか。よろしくお願いします。

コードの構造

multiprocessingで使用する変数の宣言はif __name__ == '__main__'内にあります。また、receive_transaction以外の関数は省略し、その他ここには記載していない関数も多々あります。画像は、receive_transaction内の2個目のwhile文を示しています。

python

1def mine(... 2def new_transaction(... 3def receive_transaction(Mflag, transactions, recv_transactions, combined_transactions): 4 # cache-producer side = receive broadcasted data 5 # receive preInterest/transaction 6 7 with cefpyco.create_handle() as handle: 8 handle.register("ccnx:/preInterest/transaction") 9 while True: 10 info = handle.receive() 11 if info.is_succeeded and ("ccnx:/preInterest/transaction" in info.name) and (node_identifier not in info.name): 12 print("Receive transaction preInterest") 13 print(info.name) 14 namePrefix = re.findall("ccnx:/preInterest/transaction/(\w+)", info.name) # confirm sender's uuid 15 handle.send_interest("ccnx:/broadcast/transaction/{}/{}".format(namePrefix[0], node_identifier)) 16 print("Sended transaction Interest") 17 # ccnx:/broadcast/transaction/sender's node id/my node id 18 19 while True: 20 tmpinfo = handle.receive() 21 if tmpinfo.is_succeeded and ("ccnx:/broadcast/transaction/{}/{}".format(namePrefix[0], node_identifier) in tmpinfo.name): 22 print("Receive transaction packet") 23 print(tmpinfo) 24 transaction = ast.literal_eval(tmpinfo.payload.decode("UTF-8")) 25 recv_transactions.append(transaction) 26 27 combined_transactions = transactions[:] + recv_transactions[:] 28 if len(combined_transactions) == 10: 29 print("----------recv_transaction Mflag----------") 30 Mflag.value = 1 31 32 break 33def forward_transaction(... 34def forward_block(... 35def receive_block(... 36 37if __name__ == '__main__': 38 39 manager = Manager() 40 41 # mine flag 42 Mflag = manager.Value('i', 0) # 1 means combined_transactions = 10 43 44 # list for sharing each other 45 transactions = manager.list() 46 recv_transactions = manager.list() 47 combined_transactions = manager.list() 48 49 chain = manager.list() 50 recv_chain = manager.list() 51 combined_chain = manager.list() 52 53 chain.append(blockchain.chain[-1]) 54 55 jobs = [ 56 Process(target=mine, args=(Mflag, transactions, recv_transactions, 57 combined_transactions, chain,)), 58 Process(target=new_transaction, args=(Mflag, transactions, 59 recv_transactions, combined_transactions,)), 60 Process(target=receive_transaction, args=(Mflag, transactions, recv_transactions, 61 combined_transactions,)), 62 Process(target=receive_block, args=(recv_chain,)), 63 ] 64 65 for j in jobs: 66 j.start() 67 68 for j in jobs: 69 j.join()

コード補完されない例

イメージ説明

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

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

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

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

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

y_waiwai

2022/12/07 05:05

提示のコードのどこにmultiprocessingが使われてるんでしょうか 問題がわかりません
quickquip

2022/12/07 05:13

multiprocessing がどうこうではなくて、multiprocessingに関連してコードの構造が変わったからと考えるのが自然ではないでしょうか。部分だけ取り出しても議論できなさそうです。
Pirekatsu

2022/12/07 06:24

すみませんいろいろ省いてしまいました。multiprocessingで共有して使える変数とは言えど、グローバル変数のようにコード補完がされていないと認識しています。
quickquip

2022/12/07 07:22 編集

with cefpyco.create_handle() as handle: でhandleを束縛するオブジェクトの型が(VS Codeが)分かってないだけに見えました。 これを推測できると思う理由の方を(逆に)説明してほしいです。 あと、multiprocessingがない時に補完が効く状況の説明(つまりmultiprocessingのせいだと判断したのはなぜか?)という説明もない気がします。
Pirekatsu

2022/12/07 09:52

一つ目ですが、すみません一部自分が勘違いしていました。decodeの方はまだ実態のないものをdecodeしようとしているのでコード補完がされていないのだと思います(tmpinfo.payloadは通信先から送られてくるデータであり、コードを書いている時点ではtmpinfo.payloadがないためコード補完がされない)。 私がお聞きしたいところはrecv_transactionsの後ろのappendのコード補完がされない問題にあります。 multiprocessingがない場合の挙動ですが、たとえばdef recv_transaction内にrecv_transactions = []というような初期化を書いておけば、その関数内においてはrecv_transactionsにコード補完が効き、ap...と打つ段階でappendが選択肢にでてきて色もつくといった形になります。 おそらくrecv_transactionsの宣言がrecv_transaction関数の後に宣言しているためコード補完がされないのだと思いますが、どうにかする方法はありますか?
Pirekatsu

2022/12/07 09:54 編集

すみませんまた分かりにくいですね。 recv_transactions = manager.list()がif __name__ == '__main__':内にあり、これがdef recv_transactions(...の後にあるからコード補完がされていないと自分は考えています。
guest

回答1

0

自己解決

解決していませんが終わりにします。

投稿2022/12/11 07:07

Pirekatsu

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問