多处理,线程被卡住,打印输出被弄乱

问题描述 投票:0回答:1

我正在python中运行多个线程。我尝试使用线程模块,多处理模块。即使执行给出正确的结果,每当终端卡住并且输出的打印变得混乱时,也是如此。这是代码的简化版。

import subprocess
import threading
import argparse
import sys

result = []

def check_thread(args,components,id):
    for i in components:
        cmd = <command to be given to terminal>
        output = subprocess.check_output([cmd],shell=True)
        result.append((id,i,output))

def check(args,components):
    # lock = threading.Lock()
    # lock = threading.Semaphore(value=1)
    thread_list = []
    for id in range(3):
        t=threading.Thread(target=check_thread, args=(args,components,i))
        thread_list.append(t)

    for thread in thread_list:
        thread.start()

    for thread in thread_list:
        thread.join()

    for res in result:
        print(res)

    return res

if __name__ == 'main':
    parser = argparse.ArgumentParser(....)
    parser.add_argument(.....)
    args = parser.parse_args()
    components = ['comp1','comp2']
    while True:
        print('SELECTION MENU\n1)\n2)\n')
        option = raw_input('Enter option')
        if option=='1':
            res = check(args, components)
        if option=='2':
            <do something else>
        else:
            sys.exit(0)   

我已经尝试将多处理模块与Process,pool一起使用。尝试将锁传递给check_thread,尝试从check_thread()返回一个值,并使用队列来接收这些值,但每次结果相同时,执行成功,但终端卡住了,打印输出也很破旧。有没有解决办法?我正在使用python 2.7。这是破旧输出的样子output

python multithreading multiprocessing python-multiprocessing python-multithreading
1个回答
0
投票

您应该使用队列模块而不是列表。

import multiprocessing as mp

# Define an output queue
output = mp.Queue()

# define a example function
def function(params, output):
    """ Generates a random string of numbers, lower- and uppercase chars. """
    # Process params and store results in res variable
    output.put(res)

# Setup a list of processes that we want to run
processes = [mp.Process(target=function, args=(5, output)) for x in range(10)]

# Run processes
for p in processes:
    p.start()

# Exit the completed processes
for p in processes:
    p.join()

# Get process results from the output queue
results = [output.get() for p in processes]

print(results)
© www.soinside.com 2019 - 2024. All rights reserved.