1つのスレッドを使用して4つの数値をファイルに書き込んで、別のスレッドで同じ値を読み取る必要があります。もちろん、これはすべて同時でなければなりません。 2番目のスレッドは、値を読み取らずに値を変更します。それはできますか?数値をファイルに書き込んで、Pythonの別のスレッドで同じ値を読み取る方法は?
答えて
まず、同じプロセスに属するスレッド間でデータを転送する場合は、ファイルを通信ポイントとして使用する必要はありません。最も簡単な方法はFIFOスタイルを使用してあるスレッドから別のスレッドにデータを送信するスレッドセーフのPythonメカニズムであるqueuesを使用することです。
#!/usr/bin/python3
from threading import Thread
from queue import Queue
from time import sleep
q = Queue()
def run_func_in_diff_thread(func, *args):
t = Thread(target=func, args=args)
t.setDaemon = True
t.start()
def writer(data_set):
global q # queue must be shared/common for our threads
print("Writer thread started")
for elem in data_set:
q.put(elem) # put current elem into queue
print("%s > %d" % ("writer", elem))
sleep(1)
q.put(-1) # something like last element
print("Writer thread finished since last element has been put")
def reader():
global q # queue must be shared/common for our threads
print("Reader thread started")
while True:
elem = q.get() # remove and return an item from the queue
print("%s > %d" % ("reader", elem))
sleep(0.1)
if elem == -1:
break
print("Reader thread finished since last element has been received")
data = [x for x in range(5)]
run_func_in_diff_thread(writer, data)
run_func_in_diff_thread(reader)
次のような出力が得られます:
Writer thread started
writer > 0
Reader thread started
reader > 0
writer > 1
reader > 1
writer > 2
reader > 2
writer > 3
reader > 3
writer > 4
reader > 4
Writer thread finished since last element has been put
reader > -1
Reader thread finished since last element has been received
これは非常に単純ですが、イマイチ」それを?あなたが本当にあなたのスレッド間でデータを送信するために、ファイルを使用する必要がある場合、私は次のように提案することができ
[OK]を、:
#!/usr/bin/python3
from threading import Thread, Lock
from time import sleep
lock = Lock() # lock to synchronize your threads
def run_func_in_diff_thread(func, *args):
t = Thread(target=func, args=args)
t.setDaemon = True
t.start()
def read_or_write(path, type='r', data=None):
if type == 'r':
with open(path, type) as f:
elem = f.readlines()[-1] # read last element
print("Read data from file < %d" % int(elem))
if int(elem) == -1:
print("Received last element. Stop reading")
return False
return True
else:
with open(path, type) as f:
print("Write data to file > %d" % data)
f.write("%s\n" % str(data))
return True
def func_runner(func, file_path, type, data_set=None):
if type == "a":
# writer
for data in data_set:
lock.acquire()
read_or_write(file_path, type, data)
lock.release()
sleep(1)
else:
# reader
while True:
lock.acquire()
res = func(file_path, type)
lock.release()
if not res:
break
sleep(1)
data_set = [x for x in range(5)]
data_set.append(-1) # something like last element
file_path = "file.txt"
run_func_in_diff_thread(func_runner, read_or_write, file_path, "a", data_set)
run_func_in_diff_thread(func_runner, read_or_write, file_path, "r")
そして、あなたは次のような出力を得るでしょう:
Write data to file > 0
Read data from file < 0
Read data from file < 0
Write data to file > 1
Read data from file < 1
Write data to file > 2
Read data from file < 2
Write data to file > 3
Read data from file < 3
Write data to file > 4
Read data from file < 4
Write data to file > -1
Read data from file < -1
Received last element. Stop reading
をこの場合、Lock - データの破損を避けるためにスレッドを同期するためのメカニズムが組み込まれている必要があります。
私が言ったように、スレッド同期のためにファイルを使用するのではなく、キューを使用することを検討してください。
また、多くの場合に便利なさまざまなプロセス間でキューを使用してデータを送信できます。しかし、この場合は、 'multiprocessing'モジュールから' queue'する必要があります。ドキュメントは[こちら](https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes)です。 –
- 1. Node.jsファイルを読み込み、2つの別々の関数で同じファイルを書き込む方法は?
- 2. 複数のスレッドで書き込みファイルを読み込む
- 3. 複数のスレッドが同じ変数に同じ値を書き込んでも構いませんか?
- 4. 複数のスレッドが同じブール値に書き込む
- 5. 同じファイルへの書き込みと読み取り
- 6. Javaの同じファイルへの読み込みと書き込み
- 7. 辞書の同じキーの値を読み込んで追加する
- 8. Rustの同じTcpStreamでの読み取りと書き込み
- 9. 環境変数を書き込んで同じプロセスから読み取る
- 10. 2つのスレッドによるファイルの同時読み込み/書き込み
- 11. pdfファイルを読み込んでoutputStreamに書き込む方法
- 12. ノード内の同じファイルに非同期で書き込みして読み込む方法は?
- 13. 同じファイルへの読み込み/書き込み(gmon.outの取得)
- 14. ファイルから単語を読み込んで同じ行に書き込む
- 15. 同じコアの別のスレッドが書き込みバッファから書き込んだ値をバイパスできないのはなぜですか?
- 16. Jframe属性を読み込んでその値をxmlファイルに書き込む
- 17. テキストファイルを数値に読み込んでその数値の合計値を取得する方法
- 18. .txtファイルから値を読み込んで出力ファイルに書き込む
- 19. 同じファイルに複数のスレッドを書き込む
- 20. メモリキー値ストアで複数回読み込みを書き込む
- 21. 同じFileStreamでの読み込みと書き込み
- 22. 書き込みと読み取りのインデックスが同じでないファイル
- 23. 同じファイル(Python)から2つの辞書を読み込む
- 24. Pythonはパンダを使用してシート上の値を評価するファイルを読み込んで書き込む
- 25. Pythonでファイルに書き込む、Arduinoでファイルを読み込む
- 26. 別の言語のファイルベースにデータを書き込んで読み込む方法
- 27. 最初の10000行をファイルから読み込んで別のファイルに書き込む方法は? PHP
- 28. Pythonでファイルからパラメータ値を読み取る方法
- 29. Cリンクリストをファイルから読み込んで別のファイルに書き込む
- 30. ファイルから読み込んでStringIOに書き込む - Python
ファイルにデータを書き込む必要がありますか、スレッド間で情報を渡したいだけですか?これが最初に考えたアプローチですか?おそらく、[Queues](https://docs.python.org/3.6/library/queue.html)を使用している可能性があります。これはあなたのために大変な作業です。 – Kevin
データは別のスクリプトで使用されているので、ファイルに書き込む方が良いと思います。あなたは思いませんか? –
あなたの定義に依存しますが、もちろん可能ですが、もちろん可能です。あなたはファイルを使用する必要がありますか? [queues](https://docs.python.org/2/library/queue.html)を見ましたか?何を試しましたか? – SiHa