এখানে উত্তরগুলির মধ্যে কোনওটিই আমার সমস্ত প্রয়োজনকে সম্বোধন করে না।
- স্টাডাউটের জন্য কোনও থ্রেড নেই (কোনও মূল্য নেই, ইত্যাদি)
- আমার অন্যান্য চলমান জিনিসগুলি পরীক্ষা করার প্রয়োজন হিসাবে নন-ব্লক করা
- আমার একাধিক জিনিস যেমন স্ট্রিম আউটপুট করা দরকার ছিল তেমন পাইপ ব্যবহার করুন, লগ ফাইলে লিখুন এবং আউটপুটটির স্ট্রিং কপি ফিরিয়ে দিন।
সামান্য ব্যাকগ্রাউন্ড: আমি থ্রেডপুলএক্সিকিউটরটি একটি থ্রেডের পুল পরিচালনা করতে ব্যবহার করছি, প্রত্যেকটি একটি উপ-প্রসেস চালু করে এবং সেগুলি একযোগে চালাচ্ছি। (পাইথন 2.7 এ, তবে এটি আরও নতুন 3.x তেও কাজ করা উচিত)। আমি কেবল আউটপুট সংগ্রহের জন্য থ্রেডগুলি ব্যবহার করতে চাই না কারণ আমি অন্যান্য জিনিসের জন্য যতটা সম্ভব উপলভ্য চাই (২০ টি প্রক্রিয়ার একটি পুল চলতে চলতে 40 টি থ্রেড ব্যবহার করবে; প্রক্রিয়া থ্রেডের জন্য 1 এবং স্টাডাউটের জন্য 1 ... এবং আপনি যদি স্ট্যাডার চান তবে আরও অনেক কিছু)
আমি প্রচুর ব্যতিক্রম এবং এখান থেকে পিছনে চলেছি তাই এটি প্রযোজনার কোডের উপর ভিত্তি করে। আশা করি আমি কপি এবং পেস্ট এ এটি নষ্ট করিনি। এছাড়াও, প্রতিক্রিয়া অনেক স্বাগত!
import time
import fcntl
import subprocess
import time
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# Make stdout non-blocking when using read/readline
proc_stdout = proc.stdout
fl = fcntl.fcntl(proc_stdout, fcntl.F_GETFL)
fcntl.fcntl(proc_stdout, fcntl.F_SETFL, fl | os.O_NONBLOCK)
def handle_stdout(proc_stream, my_buffer, echo_streams=True, log_file=None):
"""A little inline function to handle the stdout business. """
# fcntl makes readline non-blocking so it raises an IOError when empty
try:
for s in iter(proc_stream.readline, ''): # replace '' with b'' for Python 3
my_buffer.append(s)
if echo_streams:
sys.stdout.write(s)
if log_file:
log_file.write(s)
except IOError:
pass
# The main loop while subprocess is running
stdout_parts = []
while proc.poll() is None:
handle_stdout(proc_stdout, stdout_parts)
# ...Check for other things here...
# For example, check a multiprocessor.Value('b') to proc.kill()
time.sleep(0.01)
# Not sure if this is needed, but run it again just to be sure we got it all?
handle_stdout(proc_stdout, stdout_parts)
stdout_str = "".join(stdout_parts) # Just to demo
আমি নিশ্চিত এখানে ওভারহেড যুক্ত হচ্ছে তবে এটি আমার ক্ষেত্রে উদ্বেগের বিষয় নয়। কার্যত এটি আমার যা প্রয়োজন তা করে। কেবলমাত্র আমি সমাধান করি নি যে এটি লগ বার্তাগুলির জন্য নিখুঁতভাবে কাজ করে তবে আমি কিছু print
বার্তা পরে এবং সমস্ত একবারে প্রদর্শিত হতে দেখি see