Celery - 在任务

时间:2015-07-19 20:11:54

标签: javascript python flask celery

我有一个基于Python的烧瓶应用程序,我使用Celery任务队列来处理一组电子邮件任务。我希望Celery任务能够查询我已绑定到整个应用程序的sqlite数据库,以便拉入并使用某些数据但我不断收到以下错误。如果我在查询我的SQLite数据库的celery任务中拉出一行,那么任务就会执行而不会抛出这个错误,所以我的假设是我在制作关于将芹菜和我的数据库绑在一起的基本错误。

[2015-07-18 21:36:25,168: ERROR/MainProcess] Process 'Worker-1' pid:6657 exited with 'signal 11 (SIGSEGV)'
[2015-07-18 21:36:25,187: ERROR/MainProcess] Task app.views.send_mail_task[4c3d5b1a-5ac3-4ab8-b633-b925eba5dd02] raised unexpected: WorkerLostError('Worker exited prematurely: signal 11 (SIGSEGV).',)
Traceback (most recent call last):
  File "/Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/billiard/pool.py", line 1171, in mark_as_worker_lost
    human_status(exitcode)),
WorkerLostError: Worker exited prematurely: signal 11 (SIGSEGV).

相关代码如下:

models.py

...

class Company(Model):
  dont_contact_anymore = BooleanField(default=False)
  company_name = CharField()
  website = CharField(unique=True)
  email_address = CharField()
  country = CharField()
  scraped_on = DateTimeField(formats="%m-%d-%Y")
  have_contacted = BooleanField(default=False)
  current_pipeline_phase = IntegerField(default=0)


  sector = CharField()
  contacted_by = ForeignKeyField(
    rel_model=User,
    related_name='contacted_by',
    db_column='contacted_by'
    )

  class Meta:
    database = DATABASE
    order_by = ('have_contacted',)

  @classmethod
  def create_company(cls, company_name, website, email_address):
    try:
      with DATABASE.transaction():
        cls.create(company_name=company_name, website=website, email_address=email_address, scraped_on=datetime.now)
        print 'Saved {}'.format(company_name)
    except IntegrityError:
      print '{} already exists in the database'.format(company_name)

...

celery.js

function start_the_magic() {
  //Get the ids of the companies to contact and remove
  var ids = get_the_ids();

  var contact = ids[0]
  var remove = ids[1]

  console.log(contact);
  console.log(remove);

  $.ajax({
      type: 'POST',
      url: '/email_task',
      data: JSON.stringify({contact: contact, remove: remove}),
      contentType: "application/json; charset=utf-8",
      dataType: 'json',
      success: function(data, status, request) {
          status_url = request.getResponseHeader('Location');
          update_progress(status_url, '#progress div');
      },
      error: function() {
          alert('Unexpected error');
      }
  });
}


function update_progress(status_url, status_div) {
  // send GET request to status URL
  $.getJSON(status_url, function(data) {
      // update UI
      percent = parseInt(data['current'] * 100 / data['total']);
      //Remove the table and install the progress bar
      $('div.progress-container').html("");
      $('div.progress-container').html(bootstrap_progress);
      $(status_div).text(percent + '%');
      if (data['state'] != 'PENDING' && data['state'] != 'PROGRESS') {
          if ('result' in data) {
              // show result
              console.log('update progress worked!');
              // $(status_div.childNodes[3]).text('Result: ' + data['result']);
          }
          else {
              // something unexpected happened
              console.log('something unexpected happened');
              // $(status_div.childNodes[3]).text('Result: ' + data['state']);
          }
      }
      else {
          // rerun in 2 seconds
          setTimeout(function() {
              update_progress(status_url, status_div);
          }, 2000);
      }
  });
}

view.py

...

@celery.task(base=DbTask, bind=True)
def send_mail_task(self, contact, remove):
    total_contact_companies = len(contact);
    verb = ['Starting up', 'Booting', 'Repairing', 'Loading', 'Checking']
    adjective = ['master', 'radiant', 'silent', 'harmonic', 'fast']
    noun = ['solar array', 'particle reshaper', 'cosmic ray', 'orbiter', 'bit']
    message = ''

    for num,i in enumerate(contact):
      company = Company.select().where(Company.id == i).get()

      **^This is the line where things are failing^**

      print 'Contacting ' + company
      message = 'E-mailing {} at {}...'.format(company.company_name, company.email_address)

      self.update_state(state='PROGRESS',
                          meta={'current': num, 'total': total_contact_companies,
                                'status': message})
      time.sleep(3)
    return {'current': 100, 'total': 100, 'status': 'Task completed!',
            'result': 42}

....

当我尝试在celery任务中查询我的Sqlite数据库时,基本上会触发错误。

company = Company.select().where(Company.id == i).get()

另外,我正在为Celery使用Redis数据库。

更新

以下是来自Celery日志的更详细的描述:

[2015-07-19 21:13:46,326: INFO/MainProcess] Received task: app.views.send_mail_task[acff718c-a5e3-430c-96d7-789d969cdb4f]
[2015-07-19 21:13:46,328: DEBUG/MainProcess] TaskPool: Apply <function _fast_trace_task at 0x10bf07aa0> (args:('app.views.send_mail_task', 'acff718c-a5e3-430c-96d7-789d969cdb4f', [[u'1869', u'1870', u'1871'], []], {}, {'utc': True, u'is_eager': False, 'chord': None, u'group': None, 'args': [[u'1869', u'1870', u'1871'], []], 'retries': 0, u'delivery_info': {u'priority': 0, u'redelivered': None, u'routing_key': u'celery', u'exchange': u'celery'}, 'expires': None, u'hostname': 'celery@JoeyOrlandoMacBookAir.local', 'task': 'app.views.send_mail_task', 'callbacks': None, u'correlation_id': u'acff718c-a5e3-430c-96d7-789d969cdb4f', 'errbacks': None, 'timelimit': (None, None), 'taskset': None, 'kwargs': {}, 'eta': None, u'reply_to': u'58c6e8a9-cab4-3f00-aacd-d761a3550934', 'id': 'acff718c-a5e3-430c-96d7-789d969cdb4f', u'headers': {}}) kwargs:{})
[2015-07-19 21:13:46,331: WARNING/Worker-1] this line will eventually get replaced with the company name that is getting contacted
[2015-07-19 21:13:46,332: DEBUG/MainProcess] Task accepted: app.views.send_mail_task[acff718c-a5e3-430c-96d7-789d969cdb4f] pid:44579
[2015-07-19 21:13:46,336: DEBUG/Worker-1] ('SELECT "t1"."id", "t1"."dont_contact_anymore", "t1"."company_name", "t1"."website", "t1"."email_address", "t1"."country", "t1"."scraped_on", "t1"."have_contacted", "t1"."current_pipeline_phase", "t1"."day_0_message_id", "t1"."day_0_response", "t1"."day_0_sent", "t1"."day_5_message_id", "t1"."day_5_response", "t1"."day_5_sent", "t1"."day_35_message_id", "t1"."day_35_response", "t1"."day_35_sent", "t1"."day_125_message_id", "t1"."day_125_response", "t1"."day_125_sent", "t1"."batch", "t1"."sector", "t1"."contacted_by" FROM "company" AS t1 WHERE ("t1"."id" = ?) ORDER BY "t1"."have_contacted" ASC LIMIT 1', [1869])
[2015-07-19 21:13:46,717: ERROR/MainProcess] Process 'Worker-1' pid:44579 exited with 'signal 11 (SIGSEGV)'
[2015-07-19 21:13:46,730: ERROR/MainProcess] Task app.views.send_mail_task[acff718c-a5e3-430c-96d7-789d969cdb4f] raised unexpected: WorkerLostError('Worker exited prematurely: signal 11 (SIGSEGV).',)
Traceback (most recent call last):
  File "/Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/billiard/pool.py", line 1171, in mark_as_worker_lost
    human_status(exitcode)),
WorkerLostError: Worker exited prematurely: signal 11 (SIGSEGV).

使用芹菜rdb功能更新#2

~$ telnet localhost 6903
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
> /Users/wyssuser/Desktop/new_danish/app/views.py(107)send_mail_task()
-> company = Company.select().where(Company.id == i).get()
(Pdb) n
Connection closed by foreign host.
wyssuser@joeyorlcbookair:~$ telnet localhost 6902
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
> /Users/wyssuser/Desktop/new_danish/app/views.py(107)send_mail_task()
-> company = Company.select().where(Company.id == i).get()
(Pdb) s
--Call--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(4092)select()
-> @classmethod
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(4094)select()
-> query = SelectQuery(cls, *selection)
(Pdb) s
--Call--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2536)__init__()
-> def __init__(self, model_class, *selection):
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2537)__init__()
-> super(SelectQuery, self).__init__(model_class)
(Pdb) s
--Call--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2328)__init__()
-> def __init__(self, model_class):
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2329)__init__()
-> super(Query, self).__init__()
(Pdb) s
--Call--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(376)__init__()
-> def __init__(self):
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(377)__init__()
-> self._negated = False
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(378)__init__()
-> self._alias = None
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(379)__init__()
-> self._bind_to = None
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(380)__init__()
-> self._ordering = None  # ASC or DESC.
(Pdb) s
--Return--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(380)__init__()->None
-> self._ordering = None  # ASC or DESC.
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2331)__init__()
-> self.model_class = model_class
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2332)__init__()
-> self.database = model_class._meta.database
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2334)__init__()
-> self._dirty = True
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2335)__init__()
-> self._query_ctx = model_class
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2336)__init__()
-> self._joins = {self.model_class: []}  # Join graph as adjacency list.
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2337)__init__()
-> self._where = None
(Pdb) s
--Return--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2337)__init__()->None
-> self._where = None
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2538)__init__()
-> self.require_commit = self.database.commit_select
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2539)__init__()
-> self.__select(*selection)
(Pdb) s
--Call--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2621)__select()
-> def __select(self, *selection):
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2622)__select()
-> self._explicit_selection = len(selection) > 0
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2623)__select()
-> selection = selection or self.model_class._meta.get_fields()
(Pdb) s
--Call--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3932)get_fields()
-> def get_fields(self):
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3933)get_fields()
-> return [f[1] for f in self.get_sorted_fields()]
(Pdb) s
--Call--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3925)get_sorted_fields()
-> def get_sorted_fields(self):
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3926)get_sorted_fields()
-> key = lambda i: i[1]._sort_key
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3927)get_sorted_fields()
-> return sorted(self.fields.items(), key=key)
(Pdb) s
--Call--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3926)<lambda>()
-> key = lambda i: i[1]._sort_key
(Pdb) r
--Return--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3926)<lambda>()->(2, 42)
-> key = lambda i: i[1]._sort_key
(Pdb) r
--Return--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3927)get_sorted_fields()->[('id', <peewee....1228f910>), ('dont_contact_anymore', <peewee....12289e50>), ('company_name', <peewee....1228f190>), ('website', <peewee....1228f1d0>), ('email_address', <peewee....1228f210>), ('country', <peewee....1228f250>), ...]
-> return sorted(self.fields.items(), key=key)
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3933)get_fields()
-> return [f[1] for f in self.get_sorted_fields()]
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3933)get_fields()
-> return [f[1] for f in self.get_sorted_fields()]
(Pdb) s
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3933)get_fields()
-> return [f[1] for f in self.get_sorted_fields()]
(Pdb) r
--Return--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(3933)get_fields()->[<peewee....1228f910>, <peewee....12289e50>, <peewee....1228f190>, <peewee....1228f1d0>, <peewee....1228f210>, <peewee....1228f250>, ...]
-> return [f[1] for f in self.get_sorted_fields()]
(Pdb) r
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2624)__select()
-> self._select = self._model_shorthand(selection)
(Pdb) r
--Return--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2624)__select()->None
-> self._select = self._model_shorthand(selection)
(Pdb) r
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2540)__init__()
-> self._from = None
(Pdb) r
--Return--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(2554)__init__()->None
-> self._qr = None
(Pdb) r
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(4095)select()
-> if cls._meta.order_by:
(Pdb) r
--Return--
> /Users/wyssuser/Desktop/new_danish/venv/lib/python2.7/site-packages/peewee.py(4097)select()-><class '...d" ASC []
-> return query
(Pdb) r
Connection closed by foreign host.

0 个答案:

没有答案