Pythonのスレッドの問題

スレッド

スレッドとは何ですか

  • ユニットは、プロセッサ・システムに割り当てられた実行フロー時間リソースの基本単位内で、またはプロセスが独立して行なわ

機能

  • プログラム実行の最小単位

なぜ我々は、スレッドが必要なのか

  1. 同時に、プロセスは、あなたは多くのことをしたいならば、それは難しいだろう、一つのことを行うことができます
  2. ブロックされた実装プロセスで遭遇し、全体のプロセスがハングします

スレッドを開く方法

#方式一
from threading import Thread
import time

###线程开启的第一种方式
def mythred():
    print('线程开启')
    time.sleep(5)
    print('线程结束')
#线程中可加可不加
if __name__ == '__main__':
    t = Thread(target = mythred)
    t.start()


#####方式二
from threading import Thread
import time
#通过类继承额方法
class Mythred(Thread):
    def run(self):
        print('线程开启')
        time.sleep(5)
        print('线程结束')

t = Mythred()
t.start()

スピードVSスレッドの作成率の作成プロセス

from threading import Thread
from multiprocessing import Process
import time

def task(name):
    print(f'{name} is running')
    time.sleep(2)
    print(f'{name} is end')


if __name__ == '__main__':
    t = Thread(target=task,args=('子线程',))
    p = Process(target=task,args=('子进程',))
    # t.start()
    p.start()
    print('主')

'''
开启子线程的打印效果:

子线程 is running
主
子线程 is end

开启子进程打印效果:

主
子进程 is running
子进程 is end

进程和线程的创建速度
开启子进程需要申请资源开辟空间 慢
开启子线程只是告诉操作系统一个执行方案 快
'''

メソッドのスレッドに参加

スレッドとプロセスを使用する方法に参加するのと同じ方法に参加

from threading import Thread
import time
def task():
    print('子线程 start')
    time.sleep(2)
    print('子线程 end')

t = Thread(target=task)
t.start()
t.join() # 等待子线程运行结束
print('主线程')

デーモンスレッド

# 守护线程 守护的是进程的运行周期
from threading import Thread,enumerate,currentThread
import time

def task():
    print('守护线程开始')
    print(currentThread())
    time.sleep(20)
    # print('守护线程结束')

def task2():
    print('子线程 start')
    time.sleep(5)
    print(enumerate())
    print('子线程 end')

if __name__ == '__main__':
    t1 = Thread(target=task)
    t2 = Thread(target=task2)
    t1.daemon = True
    t2.start()
    t1.start()
    print('主')

セキュリティスレッドロック

from threading import Thread,Lock

x = 0
def task():
    global x
    for i in range(100000):
        x += 1


t1 = Thread(target=task)
t2 = Thread(target=task)
t3 = Thread(target=task)
t1.start()
t2.start()
t3.start()

print(x)

228891

我々は、上記のコードは、これは、x 300,000値の偏差を生じるべきであることを見出しました。

ソリューション
from threading import Thread,Lock

x = 0
lock = Lock()
def task():
    global x
    lock.acquire()
    for i in range(200000):
        x += 1
    lock.release()

t1 = Thread(target=task)
t2 = Thread(target=task)
t3 = Thread(target=task)
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
print(x)

スレッドのデッドロックの問題

いわゆるデッドロック

  • 現象が実装プロセス内の2つの以上のプロセスまたはスレッドを意味し、お互いを待っによって引き起こされるリソースの競合の結果は、外力のない状態で、彼らはそれを促進することができません。この時点で、システムはデッドロックと呼ばれる別のプロセスを待っているの過程で常にデッドロックを生成するために、デッドロック状態またはシステムであると言います

おすすめ

転載: www.cnblogs.com/ledgua/p/11543917.html