同步进程Python

2024-09-30 22:10:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经读了很多关于python处理的文章,但是我似乎不知道如何同时运行两个方法/进程。这是我的代码,它在一个名为超级测试.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()

我尝试过运行线程、进程和所有东西,但出于某种原因,我在输出中得到的只是:

^{pr2}$

我想在控制台上打印这样的东西

printFiveCalled
printTenCalled
printTenCalled
printFiveCalled
printTenCalled
printTenCalled

Tags: nameinimportfortime进程defrange
2条回答

接近!我认为问题来自于你的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/process是理想的)。但是,python线程不是真正的多线程,因为全局解释器锁将禁止多个线程同时运行。在

结论:线程是串行运行的,进程是并行运行的。 当部分计算不是用Python完成时,线程是很有用的。i、 e.当使用numpy、OpenCV。。。交换到C的库

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

^{pr2}$

注意:对于线程,我很欣赏使用multiprocessing.dummy,它的工作原理与multiprocessing完全相同,但与线程一起使用。在

我注意到的第一件事是目标应该是一个函数,这意味着您传递函数(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()

输出:

^{pr2}$

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

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

相关问题 更多 >