0

メインプロセスと並行して関数を継続的に実行したいのですが、python?multiprocessing?threading または thread モジュールで実行するにはどうすればよいですか? 私はpythonが初めてです。どんな助けでも大歓迎です。

4

4 に答える 4

2

目的がキャプチャ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ます。

より興味深いが、あまり実用的ではない解決策は、実際にスレッドを作成せずに、ある種のスケジューラーとジェネレーターを使用して並列実行をシミュレートすることです(インターネットで検索すると、これについていくつかの素晴らしい結果が得られます)

于 2012-12-18T14:00:16.447 に答える
0

それは間違いなくあなたの目的に依存しますが、スレッドモジュールを見ることをお勧めします。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()
于 2012-12-18T13:22:21.983 に答える
0

クライアントサーバーアーキテクチャが私にとっての解決策であることがわかりました。サーバーを実行し、メッセンジャーのように、サーバーとクライアント間で直接通信する多くのクライアントを生成します。

通話/通信は、ネットワークまたはメモリにあるテキスト ファイルを介して実現できます (処理を高速化し、ハード ドライブを節約するため)。

Bakuriu: ua に logging モジュールに関する良いヒントを教えてください。

于 2012-12-18T16:10:17.760 に答える
0

同じプロセスでバックグラウンドで関数を実行したいだけの場合は、次のようにします。

import thread

def function(a):
    pass

thread.start_new(function, (1,)) # a is 1 then
于 2012-12-18T13:24:55.497 に答える