メインプロセスと並行して関数を継続的に実行したいのですが、python?multiprocessing?threading または thread モジュールで実行するにはどうすればよいですか? 私はpythonが初めてです。どんな助けでも大歓迎です。
4 に答える
目的がキャプチャstderr
して何らかのアクションを実行することである場合はsys.stderr
、カスタムオブジェクトに置き換えるだけです。
>>> import sys
>>> class MyLogger(object):
... def __init__(self, callback):
... self._callback = callback
... def write(self, text):
... if 'log' in text:
... self._callback(text)
... sys.__stderr__.write(text) # continue writing to normal stderr
...
>>> def the_callback(s):
... print('Stderr: %r' % s)
...
>>> sys.stderr = MyLogger(the_callback)
>>> sys.stderr.write('Some log message\n')
Stderr: 'Some log message'
Some log message
>>>
>>> sys.stderr.write('Another message\n')
Another message
トレースバックと例外を処理する場合は、を使用できますsys.excepthook
。
logging
モジュールによって作成されたログをキャプチャする場合はHandler
、上記と同様の独自のクラスを実装できますLogger
が、メソッドを再実装しemit
ます。
より興味深いが、あまり実用的ではない解決策は、実際にスレッドを作成せずに、ある種のスケジューラーとジェネレーターを使用して並列実行をシミュレートすることです(インターネットで検索すると、これについていくつかの素晴らしい結果が得られます)
それは間違いなくあなたの目的に依存しますが、スレッドモジュールを見ることをお勧めします。threading
およびの使用に関する StackOverflow の優れた質問が多数ありますmultithreading
(例: Multiprocessing vs Threading Python )。
これは、私のプロジェクトの 1 つからの簡単なスケルトンです。
import threading # Threading module itself
import Queue # A handy way to pass tasks to your thread
job_queue = Queue.Queue()
job_queue.append('one job to do')
# This is the function that we want to keep running while our program does its thing
def function_to_run_in_background():
# Do something...here is one form of flow control
while True:
job_to_do = job_queue.get() # Get the task from the Queue
print job_to_do # Print what it was we fetched
job_queue.task_done() # Signal that we've finished with that queue item
# Launch the thread...
t = threadingThread(target=function_to_run_in_background, args=(args_to_pass,))
t.daemon = True # YOU MAY NOT WANT THIS: Only use this line if you want the program to exit without waiting for the thread to finish
t.start() # Starts the thread
t.setName('threadName') # Makes it easier to interact with the thread later
# Do other stuff
sleep(5)
print "I am still here..."
job_queue.append('Here is another job for the thread...')
# Wait for everything in job_queue to finish. Since the thread is a daemon, the program will now exit, killing the thread.
job_queue.join()
クライアントサーバーアーキテクチャが私にとっての解決策であることがわかりました。サーバーを実行し、メッセンジャーのように、サーバーとクライアント間で直接通信する多くのクライアントを生成します。
通話/通信は、ネットワークまたはメモリにあるテキスト ファイルを介して実現できます (処理を高速化し、ハード ドライブを節約するため)。
Bakuriu: ua に logging モジュールに関する良いヒントを教えてください。
同じプロセスでバックグラウンドで関数を実行したいだけの場合は、次のようにします。
import thread
def function(a):
pass
thread.start_new(function, (1,)) # a is 1 then