Maison >développement back-end >Tutoriel Python >L'utilisation de threads et de processus de robot d'exploration Python (avec code)

L'utilisation de threads et de processus de robot d'exploration Python (avec code)

不言
不言avant
2018-09-28 14:31:371749parcourir

Le contenu de cet article concerne l'utilisation des threads et des processus du robot d'exploration Python (avec du code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Process

utilise

  • pour importer la bibliothèque de classes

import multiprocessing
  • Créer un processus

p1 = multiprocessing.Process(target=test1)

Paramètres du processus : group=Aucun, target=Aucun, name=Aucun, args=(), kwargs={})

  • Variables globales

import time, os
import multiprocessing

nums = [11, 22, 33]
def test():
    nums.append(44)
    print('在进程1中nums=%s' % str(nums),id(nums))
    time.sleep(3)
def test2():
    print('在进程2中nums=%s' % str(nums),id(nums))
def main():
    print('----in 主进程 pid=%d----父进程pid=%d----' % (os.getpid(), os.getppid()))
    p = multiprocessing.Process(target=test)
    p.start()

    p2 = multiprocessing.Process(target=test2)
    p2.start()   
     # test()    
     # test2()
     if __name__ == '__main__':
    main()

Les variables globales ne sont pas partagées entre les processus car les processus sont copiés

Les threads

utilisent

  • Importer une bibliothèque de classes

import threading
  • Créer un fil de discussion

t1 = threading.Thread(target=test1,args=(1000000,))

Paramètres du fil : group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None

  • Variable globale

import time,threading

g_num = 0
mutex = threading.Lock()
def test1(num):    
global g_num    
# mutex.acquire()     
    for i in range(num):
        mutex.acquire()
        g_num += 1
        mutex.release()    
        # mutex.release()
    print('-------in test1 g_num=%d-----' % g_num)
def test2(num):    
global g_num    
# mutex.acquire()     
    for i in range(num):
        mutex.acquire()
        g_num += 1
        mutex.release()    
        # mutex.release()
    print('-------in test2 g_num=%d-----' % g_num)
def main():
    t1 = threading.Thread(target=test1,args=(1000000,))
    t2 = threading.Thread(target=test2,args=(1000000,))
    t1.start()
    t2.start()
    time.sleep(3)
    print('-------------in main Thread g_num = %d----' % g_num)
 if __name__ == '__main__':
    main()

Section critique, un seul programme entre dans le bloc de code pour exécution en même temps, en entourant généralement l'endroit modifié

Si d'autres threads appellent acquérir, le thread actuel entre en attente

threading.RLock() threading de verrouillage récursif.Sémaphore de condition ou verrouillage conditionnel

  • mode consommateur producteur

producteur consommateur Pattern est une application de la communication inter-thread

Déterminez si elle est thread-safe lorsque la structure de données elle-même est thread-safe. List([]) et le dictionnaire dic({}) ne sont pas thread-safe.

def set_value(q):
    index = 0    
    while True:
        q.put(index)
        index += 1
        q.put(index)
        index += 1
        time.sleep(2)
def get_value(q):    
while True:
        print('消费者获取数据:',q.get())   #若队列为空就sleep休眠,直到队列有数据def main():
    q = Queue(4)
    t1 = threading.Thread(target=set_value,args=[q])
    t2 = threading.Thread(target=get_value,args=[q])
    t1.start()
    t2.start()

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer

Articles Liés

Voir plus