導入している拡張機能
IntelliCode
isort
Path Intellisense
Pylance
Python
Python Indent
実現したいこと
下の画像において、decode
やappend
が白くなっています。ここを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()
コード補完されない例
提示のコードのどこにmultiprocessingが使われてるんでしょうか
問題がわかりません
multiprocessing がどうこうではなくて、multiprocessingに関連してコードの構造が変わったからと考えるのが自然ではないでしょうか。部分だけ取り出しても議論できなさそうです。
すみませんいろいろ省いてしまいました。multiprocessingで共有して使える変数とは言えど、グローバル変数のようにコード補完がされていないと認識しています。
with cefpyco.create_handle() as handle:
でhandleを束縛するオブジェクトの型が(VS Codeが)分かってないだけに見えました。
これを推測できると思う理由の方を(逆に)説明してほしいです。
あと、multiprocessingがない時に補完が効く状況の説明(つまりmultiprocessingのせいだと判断したのはなぜか?)という説明もない気がします。
一つ目ですが、すみません一部自分が勘違いしていました。decodeの方はまだ実態のないものをdecodeしようとしているのでコード補完がされていないのだと思います(tmpinfo.payloadは通信先から送られてくるデータであり、コードを書いている時点ではtmpinfo.payloadがないためコード補完がされない)。
私がお聞きしたいところはrecv_transactionsの後ろのappendのコード補完がされない問題にあります。
multiprocessingがない場合の挙動ですが、たとえばdef recv_transaction内にrecv_transactions = []というような初期化を書いておけば、その関数内においてはrecv_transactionsにコード補完が効き、ap...と打つ段階でappendが選択肢にでてきて色もつくといった形になります。
おそらくrecv_transactionsの宣言がrecv_transaction関数の後に宣言しているためコード補完がされないのだと思いますが、どうにかする方法はありますか?
すみませんまた分かりにくいですね。
recv_transactions = manager.list()がif __name__ == '__main__':内にあり、これがdef recv_transactions(...の後にあるからコード補完がされていないと自分は考えています。
回答1件
あなたの回答
tips
プレビュー