Python多线程,并发

多线程

单线程程序只有一个“手指”。但多线程的程序有多个“手指”。每个“手指”仍然移动到控制流语句定义的下一行代码,但这些“手指”可以在程序的不同地方,同时执行不同的代码行

你可以使用 Python 的threading 模块,在单独的线程中执行延迟或安排的代码。这个单独的线程将因为**time.sleep()**调用而暂停。同时,程序可以在原来的线程中做其他工作

要得到单独的线程,首先要调用 threading.Thread() 函数(通过类名的构造方法构造对象),生成一个 Thread 对象。

import threading,time

print('Start of program.')

def takeaNPA():
    time.sleep(5)
    print('hello world')

threadobj=threading.Thread(target=takeaNPA)#这里注意一下
threadobj.start()

print('goodbey world!')

请注意,关键字参数是 target=takeANap,
而不是 target=takeANap()。这是因为你想将 takeANap()函数本身作为参数,而不是
调用 takeANap(),并传入它的返回值。

结果:

Start of program.
goodbey world!
hello world

在程序的所有线程终止之前,Python 程序不会终止。在运行 threadDemo.py 时,
即使最初的线程已经终止,第二个线程仍然执行 time.sleep(5)调用。(进程没有停)

向线程的目标函数传递参数

>>> print('Cats', 'Dogs', 'Frogs', sep=' & ')
Cats & Dogs & Frogs

print()调用有3 个常规参数:‘Cats’、 ‘Dogs’和’Frogs’,以及一个关键字参数:sep=
’ & '。常规参数可以作为一个列表,传递给 threading.Thread()中的 args 关键字参数关键字参数可以作为一个字典,传递给threading.Thread()中的kwargs 关键字参数

错误示范:

hreadObj = threading.Thread(target=print('Cats', 'Dogs', 'Frogs', sep=' & '))

正确示范:

>>> import threading
>>> threadObj = threading.Thread(target=print, args=['Cats', 'Dogs', 'Frogs'],
kwargs={'sep': ' & '})
>>> threadObj.start()
Cats & Dogs & Frogs

并发问题

可以轻松地创建多个新线程,让它们同时运行。但多线程也可能会导致所谓的
并发问题。如果这些线程同时读写变量,导致互相干扰,就会发生并发问题。并发
问题可能很难一致地重现,所以难以调试。
多线程编程本身就是一个广泛的主题,超出了本书的范围。必须记住的是:为了避
免并发问题,绝不让多个线程读取或写入相同的变量。当创建一个新的Thread 对象时,
要确保其目标函数只使用该函数中的局部变量。这将避免程序中难以调试的并发问题

猜你喜欢

转载自blog.csdn.net/SeeUa/article/details/88914505