Python Eventlet Monkeypatch запускает многопоточность с другим идентификатором потока (но не мульти сопрограммы)? - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь использовать обезьяну патч в эти дни. Я обнаружил, что если код будет пропатчен обезьяной, он создаст другой поток .ident. означает ли это, что обезьяна-патч запускает несколько потоков, а не несколько сопрограмм?

Если он запускает многопоточность, что приводит к состоянию гонки, не так ли?

Пожалуйста, помогите, спасибо заранее.

есть два тестовых кода, которые я использовал.

без monkey_patch (), заблокированный код, но вывести идентичные идентификаторы потоков.

#!/usr/bin/env python
# encoding: utf-8

import eventlet
# comment monkey_patch
# eventlet.monkey_patch()
import time
import thread

workers=4
jobs = 5
record = {}
pool = eventlet.greenpool.GreenPool()

def do_work(index):
    global record
    record[index] = record.get(index, 0) + 1
    # data = "worker=%s: %s \n" % (index, record[index])
    # print data
    # eventlet.greenthread.sleep(1)

    # block
    time.sleep(1)

def work(worker, jobs):
    for x in xrange(0, jobs):
        # print same thread id
        print "worker in thread %s" % thread.get_ident()
        do_work(worker)

for i in xrange(workers):
    print 'worker: %s do %s jobs'% (i, jobs)
    pool.spawn(work, i, jobs)
pool.waitall()

вывод как ниже:

[root@172-18-211-195 shengping]# python test_mky.py
worker: 0 do 5 jobs
worker: 1 do 5 jobs
worker: 2 do 5 jobs
worker: 3 do 5 jobs
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992
worker in thread 140221126620992

с monkey_patch (), разблокированным кодом, но вывести разные идентификаторы потоков.

#!/usr/bin/env python
# encoding: utf-8

import eventlet
# comment monkey_patch
eventlet.monkey_patch()
import time
import thread

workers=4
jobs = 5
record = {}
pool = eventlet.greenpool.GreenPool()

def do_work(index):
    global record
    record[index] = record.get(index, 0) + 1
    # data = "worker=%s: %s \n" % (index, record[index])
    # print data
    # eventlet.greenthread.sleep(1)

    # block
    time.sleep(1)

def work(worker, jobs):
    for x in xrange(0, jobs):
        # print same thread id
        print "worker in thread %s" % thread.get_ident()
        do_work(worker)

for i in xrange(workers):
    print 'worker: %s do %s jobs'% (i, jobs)
    pool.spawn(work, i, jobs)
pool.waitall()

вывод такой, как показано ниже (как вы можете видеть у каждого работника с разным идентификатором потока):

[root@172-18-211-195 shengping]# python test_mky.py
worker: 0 do 5 jobs
worker: 1 do 5 jobs
worker: 2 do 5 jobs
worker: 3 do 5 jobs
worker in thread 27456048
worker in thread 27456208
worker in thread 27456368
worker in thread 27456528
worker in thread 27456048
worker in thread 27456208
worker in thread 27456368
worker in thread 27456528
worker in thread 27456048
worker in thread 27456208
worker in thread 27456368
worker in thread 27456528
worker in thread 27456048
worker in thread 27456208
worker in thread 27456368
worker in thread 27456528
worker in thread 27456048
worker in thread 27456208
worker in thread 27456368
worker in thread 27456528

1 Ответ

0 голосов
/ 04 мая 2018
  • Запатентованный модуль потоков позволяет работать на зеленых потоках
  • Eventlet избегает потоков ОС, если вы не используете tpool
  • До сих пор не ясно, каковы ваши намерения или проблемы
...