2017-11-16 8 views
-2

1つのスレッドを使用して4つの数値をファイルに書き込んで、別のスレッドで同じ値を読み取る必要があります。もちろん、これはすべて同時でなければなりません。 2番目のスレッドは、値を読み取らずに値を変更します。それはできますか?数値をファイルに書き込んで、Pythonの別のスレッドで同じ値を読み取る方法は?

+0

ファイルにデータを書き込む必要がありますか、スレッド間で情報を渡したいだけですか?これが最初に考えたアプローチですか?おそらく、[Queues](https://docs.python.org/3.6/library/queue.html)を使用している可能性があります。これはあなたのために大変な作業です。 – Kevin

+0

データは別のスクリプトで使用されているので、ファイルに書き込む方が良いと思います。あなたは思いませんか? –

+0

あなたの定義に依存しますが、もちろん可能ですが、もちろん可能です。あなたはファイルを使用する必要がありますか? [queues](https://docs.python.org/2/library/queue.html)を見ましたか?何を試しましたか? – SiHa

答えて

0

まず、同じプロセスに属するスレッド間でデータを転送する場合は、ファイルを通信ポイントとして使用する必要はありません。最も簡単な方法は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 - データの破損を避けるためにスレッドを同期するためのメカニズムが組み込まれている必要があります。

私が言ったように、スレッド同期のためにファイルを使用するのではなく、キューを使用することを検討してください。

+0

また、多くの場合に便利なさまざまなプロセス間でキューを使用してデータを送信できます。しかし、この場合は、 'multiprocessing'モジュールから' queue'する必要があります。ドキュメントは[こちら](https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes)です。 –

関連する問題