同时处理 Python



我一直在阅读很多关于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

关闭!我认为问题来自您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但与线程完全相同。

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

使用线程接口,可以轻松创建两个踏板,每个踏板运行其中一个函数,并获得预期的输出。

import threading
import time
def printFive():
for i in range(5):
print('5n', end='', flush=True)
time.sleep(1)
def printTen():
for i in range(10):
print('1n', 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})

相关内容

  • 没有找到相关文章

最新更新