python - How monkey_patch(time=True) affects eventlet.spawn? -


normally, when using greenthread, can write code as:

def myfun():     print "in func" eventlet.spawn(myfunc) eventlet.sleep(0)  #then myfunc() triggered thread. 

but after use money_patch(time=true), can change code as:

eventlet.monkey_patch(time=true) eventlet.spawn(myfunc) # myfunc called 

why dont need call eventlet.sleep(0) time?

and after write own sleep function:

def my_sleep(seconds):     print "oh, god, own..." 

and set sleep attr of built-in time module my_sleep func, find my_sleep func called many times lot of outputs. can see 1 debug-thread in eclipse, did not call my_sleep func.

so, conclusion is, sleep function called continually default, , think authors of eventlet know this, developed monkey_patch() function. rigth?

#

according answer of @temoto, cpython cannot reproduce same result. thinks should add message introduce how find interesting thing.(why did not add message @ first time, cause input many words in not easy, , english not good.^^)

i find thing when remote-debug openstack code using eclipse.

in nova/network/model.py, function written this:

class networkinfoasyncwrapper(networkinfo):     """wrapper around networkinfo allows retrieving networkinfo     in async manner.      allows 1 start querying network information before     know need it.  if have long-running     operation, allows network model retrieval occur in     background.  when need data, ensure async     operation has completed.      example:      def allocate_net_info(arg1, arg2)         return call_neutron_to_allocate(arg1, arg2)      network_info = networkinfoasyncwrapper(allocate_net_info, arg1, arg2)     [do long running operation -- real network_info retrieved     in background]     [do network_info]     """      def __init__(self, async_method, *args, **kwargs):         self._gt = eventlet.spawn(async_method, *args, **kwargs)         methods = ['json', 'fixed_ips', 'floating_ips']         method in methods:             fn = getattr(self, method)             wrapper = functools.partial(self._sync_wrapper, fn)             functools.update_wrapper(wrapper, fn)             setattr(self, method, wrapper) 

when first debug function, after exeute

self._gt = eventlet.spawn(async_method, *args, **kwargs)

the call-back function async_method exeuted @ once. please remember, thread, should triggered eventlet.sleep(0).

but didnt find code call sleep(0), if sleep perhaps called eclipse, in real world(not-debug world), triggered it?

tl;dr: eventlet api not require sleep(0) start green thread. spawn(fun) start function time in future, including right now. should call sleep(0) ensure starts right now, , it's better use explicit synchronization, event or semaphore.

i can't reproduce behavior using cpython 2.7.6 , 3.4.3, eventlet 0.17.4 in either ipython or pure python console. it's eclipse calling time.sleep in background.

monkey_patch introduced shortcut running through (and third party) code , replacing time.sleep -> eventlet.sleep, , similar os, socket, etc modules. it's not related eclipse (or else) repeating time.sleep calls.

but interesting observation, thank you.


Comments

Popular posts from this blog

powershell Start-Process exit code -1073741502 when used with Credential from a windows service environment -

twig - Using Twigbridge in a Laravel 5.1 Package -

c# - LINQ join Entities from HashSet's, Join vs Dictionary vs HashSet performance -