同时处理Python

时间:2018-08-08 09:19:31

标签: python multithreading multiprocessing

我已经阅读了很多有关python处理的信息,但是我似乎无法弄清楚如何同时运行两个方法/进程。这是我的代码,它位于一个名为supertest.py的文件中,该文件是我从控制台运行的:

import threading
import time
import multiprocessing

def printFive():
    for i in range(5):
        print 'printFiveCalled'
        time.sleep(1)

def printTen():
    for i in range(10):
        print 'printTenCalled'
        time.sleep(0.5)

if __name__ == "__main__":
    p1 = multiprocessing.Process(name = 'p1', target = printFive())
    p2 = multiprocessing.Process(name = 'p2', target = printTen())

    p1.start()
    p2.start()

我已经尝试运行线程,进程,所有内容,但是由于某种原因,我在输出中得到的只是这样:

printFiveCalled
printFiveCalled
printFiveCalled
printFiveCalled
printFiveCalled
printTenCalled
printTenCalled
printTenCalled
printTenCalled
printTenCalled
printTenCalled
printTenCalled
printTenCalled
printTenCalled
printTenCalled

我想要在控制台上打印类似的内容

printFiveCalled
printTenCalled
printTenCalled
printFiveCalled
printTenCalled
printTenCalled

2 个答案:

答案 0 :(得分:1)

关闭!我认为问题出在您的target中的括号中:

import time
import multiprocessing as mp
import os

def printFive():
    for i in range(5):
        print ('printFiveCalled')
        time.sleep(1)

def printTen():
    for i in range(10):
        print ('printTenCalled')
        time.sleep(0.5)

if __name__ == "__main__":
    p1 = mp.Process(target = printFive)
    p2 = mp.Process(target = printTen)

    p1.start()
    p2.start()
    p1.join()
    p2.join()

    os.system("pause")

然后是线程处理和多处理之间的区别。通过多处理,您将同时使用计算机的多个内核(1 /进程是理想的)。但是,由于全局解释器锁会禁止同时运行多个线程,因此python线程并不是真正的多线程。

结论:线程是串行运行的,进程是并行运行的。 当部分计算未在Python中完成时,线程很有用。也就是说,当使用numpy,OpenCV等库时,这些库会交换为C。

进行多处理的最后一点:最简单的使用方法是创建1个函数,该函数需要进行大量计算并且需要在多个输入上运行。然后,可以使用Pool()map()

if __name__ == "__main__":
    with mp.Pool(processes = N) as p:
        # Function with 1 argument:
        p.map(f, inputs)

        # Function with multiple arguments:
        p.starmap(f, [(arg1, arg2) for arg1 in input1 for arg2 in input2])

注意:对于线程,我很欣赏的一种方式是使用multiprocessing.dummy,它与multiprocessing完全一样,但是带有线程。

答案 1 :(得分:0)

我注意到的第一件事是目标应该是一个函数,这意味着您传递函数(target=foo)而不是传递函数返回的内容(target=foo())。

使用线程接口,很容易创建两个踏板,每个踏板都运行您的功能之一,并获得所需的输出。

import threading
import time

def printFive():
    for i in range(5):
        print('5\n', end='', flush=True)
        time.sleep(1)

def printTen():
    for i in range(10):
        print('1\n', end='', flush=True)
        time.sleep(0.5)

if __name__ == "__main__":
    t0 = threading.Thread(target = printFive)
    t1 = threading.Thread(target = printTen)

    t0.start()
    t1.start()

输出:

5
1
1
5
1
1
5
1
1
5
1
1
5
1
1

此外,如果要将参数传递给目标,请使用argskwargs关键字。

例如threading.Thread(target=print_some_num_some_times, args=(5,), kwargs={'times': 10})